home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / redakcyjne / programy / FEBE (Firefox Environment Backup Extension) 5.0 / febe-5.0-fx.xpi / chrome / febe.jar / content / febe.js next >
Text File  |  2007-06-27  |  105KB  |  3,008 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 5.0
  4.  
  5.     window.addEventListener("load",febeLoad,true);
  6.  
  7. function febeLoad(){
  8.     febeSetMsgs();
  9.     
  10.   // See if this is a new install
  11.     var version = getFebeVersion();
  12.     var newInstall = false;
  13.     var prefName = "extensions.febe.previousversion";
  14.     if(febePrefs.prefHasUserValue(prefName)){
  15.         var pversion = febePrefs.getCharPref(prefName);
  16.         if (pversion != version){newInstall = true;}
  17.     }else{
  18.         newInstall = true;
  19.     }//if
  20.  
  21.     if(newInstall == true){
  22.         var tmp = febeMsg[155]+"\n\n";
  23.         var style = "<style>color: black;font-size: 12pt;</style>";
  24.         tmp += style+febeMsg[156]+"\n";
  25.         style = "<style>color: black; font-size: 10pt;</style>"
  26.         tmp += style+febeMsg[157]+"\n";
  27.         style = "<style>font-style: italic; color: black; font-size: 10pt;</style>"
  28.         tmp += style+febeMsg[158];
  29.         febeAlert(tmp)
  30.         febePrefs.setCharPref(prefName,version);
  31.     }//if
  32.     
  33.     
  34.   // See if a bookmark restore is in progress
  35.     var prefName = "extensions.febe.restoreBookmarks";
  36.     if(febePrefs.prefHasUserValue(prefName)){
  37.         if (febePrefs.getBoolPref(prefName)){
  38.             febeRestoreBookmarksFinish();
  39.         }//if
  40.     }//if
  41.     
  42.   // See if a username-password restore is in progress
  43.     var prefName = "extensions.febe.restorePasswords";
  44.     if(febePrefs.prefHasUserValue(prefName)){
  45.         if (febePrefs.getBoolPref(prefName)){
  46.             febeRestorePasswordsFinish();
  47.         }//if
  48.     }//if
  49.     
  50.   // See if a phishing data restore is in progress
  51.     var prefName = "extensions.febe.restorePhishingData";
  52.     if(febePrefs.prefHasUserValue(prefName)){
  53.         if (febePrefs.getBoolPref(prefName)){
  54.             febeRestorePhishingDataFinish()
  55.         }//if
  56.     }//if
  57.     
  58.   // See if a browser history restore is in progress
  59.     var prefName = "extensions.febe.restoreHistory";
  60.     if(febePrefs.prefHasUserValue(prefName)){
  61.         if (febePrefs.getBoolPref(prefName)){
  62.             febeRestoreBrowserHistoryFinish();
  63.         }//if
  64.     }//if
  65.     
  66.     febeRemind();    
  67.     febeScheduleBackup();
  68.     return true;
  69. }//febeLoad()
  70.  
  71. function febeRemind(){
  72.   // See if we need to remind about a backup
  73.     if(febeReminded == true){return true;}
  74.     var prefName = "extensions.febe.reminderdays";
  75.     var reminderDays = new Number(0);
  76.     if(febePrefs.prefHasUserValue(prefName)){
  77.         reminderDays = febePrefs.getIntPref(prefName);
  78.     }//if
  79.     if(reminderDays <= 0){return true;}
  80.     var prefName = "extensions.febe.lastbackup";
  81.     if(!febePrefs.prefHasUserValue(prefName)){return true;}
  82.     var lastBU = febePrefs.getCharPref(prefName);
  83.     var lDate = Date.parse(lastBU);
  84.     var now = Date.parse(Date());
  85.     var elapsed = (now - lDate) / (24 * 60 * 60 * 1000);    // Number of days since last backup
  86.     if(elapsed >= reminderDays){
  87.         var tmp = "<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[171]+"\n";
  88.         tmp += "<style>color: black;</style>"+febeMsg[172].replace("%days%",parseInt(elapsed))+"\n";
  89.         tmp += febeLocalizedDate(lastBU);
  90.         febeAlert(tmp);
  91.         febeReminded = true;
  92.     }//if
  93.     return true;    
  94. }//febeRemind()
  95.  
  96. function febeGetEnvironmentVariableValue(envString){
  97.     var env = Components.classes["@mozilla.org/process/environment;1"]
  98.                .createInstance(Components.interfaces.nsIEnvironment);
  99.     return env.get(envString);
  100. }//febeGetEnvironmentVariableValue
  101.  
  102. function febeInit(){
  103. //alert("febeInit")
  104.     febeVersion = febeMsg[49]+" "+getFebeVersion();
  105.     febeGetPrefs();
  106.     
  107.   // See if destination directory exists
  108.     var prefName = "extensions.febe.extBUdir";
  109.     if(febePrefs.prefHasUserValue(prefName)){
  110.         febeExBuDir = febeGetUnicharPref(prefName); 
  111.         if(febeExBuDir == ""){
  112.             if(febePlatform == 1){febeExBuDir = "C:\\";}
  113.             if(febePlatform == 2){febeExBuDir = "/";}
  114.             if(febePlatform == 3){febeExBuDir = "/";}
  115.         }//if
  116.         febeBuDesDir = Components.classes["@mozilla.org/file/local;1"]
  117.                  .createInstance(Components.interfaces.nsILocalFile);
  118.         febeBuDesDir.initWithPath(febeExBuDir);
  119.         if (!(febeBuDesDir.exists() && febeBuDesDir.isDirectory())){
  120.             febeAlert(febeMsg[0]+" \""+febeExBuDir+"\" "+febeMsg[1]+"\n"+febeMsg[2]);
  121.             return false;
  122.         }//if
  123.     } else {
  124.         febeAlert(febeMsg[3]+"\n"+febeMsg[4]);
  125.         return false;
  126.     }//if
  127.     
  128.     // Create timestamped directory if needed
  129.     if(febeUseTimestampedDir){
  130.         febeDelTimestampDirs();
  131.         var d=new Date();
  132.         var YYYY = String(d.getFullYear());
  133.         var MM = String(d.getMonth()+1);
  134.         if(MM.length == 1){MM = "0" + MM;}
  135.         var DD = String(d.getDate());
  136.         if(DD.length == 1){DD = "0" + DD;}
  137.         var hh = String(d.getHours());
  138.         if(hh.length == 1){hh = "0" + hh;}
  139.         var mm = String(d.getMinutes());
  140.         if(mm.length == 1){mm = "0" + mm;}
  141.         var ss = String(d.getSeconds());
  142.         if(ss.length == 1){ss = "0" + ss;}
  143.         var timestamp = "FEBE "+YYYY+" "+MM+"-"+DD+" "+hh+"."+mm+"."+ss;
  144.         //var timestamp = "FEBE "+YYYY+" "+MM+"-"+DD+" "+hh+"-"+mm+"-"+ss;
  145.         febeBuDesDir.append(timestamp);
  146.         if(!febeBuDesDir.exists() || !febeBuDesDir.isDirectory()){
  147.             febeBuDesDir.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0755);
  148.         }//if
  149.         febeExBuDir = febeBuDesDir.path;
  150.     }//if
  151.  
  152.     if(!febeSanityCheck()){return false;}
  153.     if(!febeInitDir()){return false;}
  154.     if(!febeClearDir()){return false;}
  155.     febeStartBackup();
  156.     return true;
  157. }//febeInit()
  158.  
  159. function febeDelTimestampDirs(){
  160.   // Delete timestamped directories if needed
  161.     if(febeMaxDirs == 0){return;}    // No limit
  162.     var dirArray = [];
  163.     var mask = /^FEBE \d\d\d\d \d\d-\d\d \d\d\.\d\d\.\d\d$/;
  164.     var buDirRoot = febeBuDesDir.clone();
  165.     var buDirParent = buDirRoot.parent.path;
  166.     var entries = buDirRoot.directoryEntries;
  167.     
  168.     while(entries.hasMoreElements()){
  169.         var entry = entries.getNext();
  170.         entry.QueryInterface(Components.interfaces.nsIFile);
  171.         var dirName = entry.leafName;
  172.         if(!entry.isDirectory()){continue;}
  173.         if(!dirName.match(mask)){continue;}
  174.         dirArray.push(dirName);
  175.     }
  176.     var numDirsToDelete = dirArray.length - febeMaxDirs + 1;
  177.     dirArray.sort();
  178.     for(var i=0; i<numDirsToDelete; i++){
  179.         var rmDir = Components.classes["@mozilla.org/file/local;1"]
  180.             .createInstance(Components.interfaces.nsILocalFile);
  181.         rmDir.initWithPath(buDirRoot.path);
  182.         rmDir.append(dirArray[i]);
  183.         rmDir.remove(true);
  184.     }//for
  185.     return true;
  186. }//febeDelTimestampDirs()
  187.  
  188. function febeAbortBackup(){
  189.   // Abort scheduled backup before it starts (only if statusbar icon is in "warning" state)
  190.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  191.            .getService(Components.interfaces.nsIWindowMediator);
  192.     var win = wm.getMostRecentWindow("navigator:browser");
  193.     var d = win.document.getElementById("febestatusbar");
  194.     if(d){
  195.         var status = d.getAttribute("status");
  196.         switch(status){
  197.             case "warning":
  198.                 var tmp="<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[179];
  199.                 if(!febeConfirm(tmp)){return;}
  200.                 for(var i in febeSetTimeoutID){
  201.                     var to = new febeSetTimeoutObj;
  202.                     to.PID = febeSetTimeoutID[i].PID;
  203.                     to.Process = febeSetTimeoutID[i].Process;
  204.                     clearTimeout(to.PID);
  205.                 }//for
  206.                 febeSetTimeoutID = [];
  207.                 var tmp = "<style>color: red; font-weight: bold;</style>"+febeMsg[150]+"\n";
  208.                 tmp += "<style>color: black; font-weight: bold;</style>"+febeMsg[151]+"\n";
  209.                 tmp += "<style>color: black; font-weight: normal;</style>"+febeMsg[152]+"\n";
  210.                 febeAlert(tmp);
  211.                 febeBuInProgress = true;    // In case it tries to start, just say no ...
  212.                 
  213.                 // Turn off scheduled backups 
  214.                 var prefName = "extensions.febe.schedule.frequency";
  215.                 febePrefs.setCharPref(prefName,"none");
  216.                 febeScheduleBackup();
  217.                 break;
  218.             case "normal":
  219.                 var prefName = "extensions.febe.schedule.description";
  220.                 var tmp = "<style>color: blue; font-weight: normal;</style>"+febeMsg[114]+"\n";
  221.                 tmp += "<style>color: black; font-weight: normal;font-family: courier;</style>"+febeGetUnicharPref(prefName);
  222.                 febeAlert(tmp);
  223.                 break;
  224.             case "nobackup": 
  225.                 var tmp = "<style>color: blue; font-weight: normal; font-size: 12px;</style>"+febeMsg[113];
  226.                 febeAlert(tmp);
  227.                 break;
  228.         }//switch
  229.             
  230.         //d.class = "statusbarpanel-iconic febe-normal";
  231.         //d.setAttribute("status","normal");
  232.     }//if
  233.     return true;
  234. }//febeAbortBackup()
  235.  
  236. function febeCopyZips(){
  237.     if(febePlatform == 1){
  238.       // Copy the zip utilities to the temp directory (febe.tmp)
  239.         febeCopyFile(febeZipFile.path,febeTmpDir.path,FEBEWINZIPFILENAME);
  240.         febeCopyFile(febeUnZipFile.path,febeTmpDir.path,FEBEWINUNZIPFILENAME);
  241.     }//if
  242. }//febeCopyZips()
  243.  
  244. function febeSanityCheck(){
  245.   // Check to see if there is anything to backup
  246.     var OK = (
  247.         buExtensions ||
  248.         buThemes ||
  249.         buBookmarks ||
  250.         buPreferences ||
  251.         buCookies ||
  252.         buUserChrome ||
  253.         buUserContent ||
  254.         buUserPwd ||
  255.         buPhishingData ||
  256.         buSearchPlugins ||
  257.         buBrowserHistory ||
  258.         buFormFillHistory ||
  259.         buPermissions ||
  260.         buUDBu ||
  261.         includeFEBE ||
  262.         buProfile);
  263.     if(!OK){febeAlert(febeMsg[131]);}
  264.     return OK;
  265. }//febeSanityCheck()
  266.  
  267. function doFebeBackup(){
  268.     febeBuInProgress = true;
  269.     if(!buProfile){
  270.         febeBackupExtensions();
  271.         febeBackupBookmarks();
  272.         febeBackupPreferences();
  273.         febeBackupCookies();
  274.         febeBackupUserChrome();
  275.         febeBackupUserContent();
  276.         febeBackupPasswords();
  277.         febeBackupPhishingData();
  278.         febeBackupSearchPlugins();
  279.         febeBackupBrowserHistory();
  280.         febeBackupFormFillHistory();
  281.         febeBackupPermissions();
  282.         febeBackupUDBu();
  283.         upBackedUp = false;
  284.     }else{
  285.         febeBackupProfile();
  286.     }
  287.     febeIncludeFEBE();
  288.     febeWriteResults();
  289.     febeStoreBUdate();
  290.     febeBuInProgress = false; 
  291.     febeScheduleBackup();    // Schedule the next backup
  292.     if (febeDebugMode == false){febeTmpDir.remove(true)};
  293.     if(febeWin){febeWin.close();}
  294.     return true;
  295. }//doFebeBackup()
  296.  
  297. function febeStoreBUdate(){
  298.   // Write last backup date to preferences
  299.     var prefName = "extensions.febe.lastbackup";
  300.     var dflt = new Date();
  301.     febeSetUnicharPref(prefName,dflt);
  302.     return true;
  303. }//febeStoreBUdate()
  304.  
  305. function febeIncludeFEBE(){
  306.   // Include a copy of FEBE with backup
  307.     if(!includeFEBE){return;}
  308.     var extDir = febeProfDir.clone();
  309.     extDir.append("extensions");
  310.     extDir.append(FEBE_GUID);
  311.  
  312.     var thisExt = new febeExtInfo(FEBE_GUID);
  313.     exBackedUp = true;    
  314.     var extName = "FEBE";
  315.     var extIcon = thisExt.iconURL;
  316.     var extHome = thisExt.homepageURL;
  317.     var batchFileName = extName;
  318.     var extBuName = batchFileName+".xpi";
  319.     var srcName = extDir.clone();
  320.     srcName = srcName.path;
  321.     febeDestDir = febeTmpDir.clone();
  322.     var batchlines = [];
  323.     if(febePlatform == 1){    // Windows
  324.         febeSubRootDir = FEBE_GUID;
  325.         febeDirCopy(extDir.path);
  326.         batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  327.         batchlines.push("SET ZFILE=\"..\\FEBEzip.exe\"");
  328.         batchlines.push("SET SRCDIR="+"\""+FEBE_GUID+"\"");
  329.         batchlines.push("SET SRCNAME="+"*");
  330.         batchlines.push("SET DEST=\"..\\FEBE.xpi\"");
  331.         batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  332.         batchlines.push("CD %TMPDIR%");
  333.         batchlines.push("CD %SRCDIR%");
  334.         batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  335.     }//if    
  336.     if(febePlatform == 2){    // *nix
  337.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  338.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  339.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+extBuName+"\"");
  340.         batchlines.push("export ZFILE");
  341.         batchlines.push("export DEST");
  342.         batchlines.push("export SRCDIR");
  343.         batchlines.push("cd \"$SRCDIR\"");
  344.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  345.     }//if    
  346.     if(febePlatform == 3){    // Mac
  347.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  348.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  349.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+extBuName+"\"");
  350.         batchlines.push("export ZFILE");
  351.         batchlines.push("export DEST");
  352.         batchlines.push("export SRCDIR");
  353.         batchlines.push("cd \"$SRCDIR\"");
  354.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  355.     }//if
  356.     if (febeGoBatch(batchFileName,batchlines)){
  357.         if(febePlatform == 1){        // Copy the backup to the destination directory
  358.             febeCopyFile(febeTmpDir.path+"\\"+extBuName,febeExBuDir,extBuName);
  359.         }//if
  360.         var item = new febeExtObj;
  361.         item.Name = batchFileName;
  362.         item.Path = "";
  363.         item.Icon = extIcon;
  364.         item.Home = extHome;
  365.         item.guid = FEBE_GUID;
  366.         item.verified = febeVerify(extBuName);
  367.         febeExtensionsList[item.Name] = item;
  368.         febeExtensionsList["**total**"]++;    
  369.     }else{
  370.         febeAlert(batchFileName+" failed")
  371.     }//if
  372.     return true;
  373. }//febeIncludeFEBE()
  374.  
  375. function febeWriteResults(){
  376.   // Create results page    
  377.     febeUpdateProgressWindow(febeMsg[77]);
  378.     
  379.     // Pointer to results page html file
  380.     var febeResultsPage = FEBEdir.clone();
  381.     febeResultsPage.append("FEBEresults.html");
  382.         
  383.   // Open results page for writing
  384.     var resultsFile = Components.classes["@mozilla.org/network/file-output-stream;1"]
  385.         .createInstance(Components.interfaces.nsIFileOutputStream);
  386.     resultsFile.init(febeResultsPage, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  387.     
  388.   // Get results template
  389.     var resultsTemplate=getFebeResultsTemplate("chrome://febe/content/FEBEresultsTemplate.html")
  390.   
  391.   // Add results to results page
  392.     var middle = new String();
  393.     var cnt = 0;
  394.         
  395.   // Create the new content
  396.     var numExt = parseInt(febeExtensionsList["**total**"]);
  397.     var numThemes = parseInt(febeThemesList["**total**"]);
  398.  
  399.     delete febeExtensionsList["**total**"];
  400.     delete febeThemesList["**total**"];
  401.  
  402.     // Sort using key array
  403.     var febeExtKey = [];
  404.     var febeThemeKey = [];
  405.     for(var i in febeExtensionsList){
  406.         febeExtKey.push(febeExtensionsList[i].Name);
  407.     }//for
  408.  
  409.     for(var i in febeThemesList){
  410.         febeThemeKey.push(febeThemesList[i].Name);
  411.     }//for
  412.     febeExtKey.sort();
  413.     febeThemeKey.sort();
  414.  
  415.     var total = numExt + numThemes;
  416.     if (bmBackedUp){total++};
  417.     if (prBackedUp){total++};
  418.     if (ckBackedUp){total++};
  419.     if (chBackedUp){total++};
  420.     if (ucBackedUp){total++};
  421.     if (pwBackedUp){total++};
  422.     if (pdBackedUp){total++};
  423.     if (spBackedUp){total++};
  424.     if (hsBackedUp){total++};
  425.     if (ffBackedUp){total++};
  426.     if (pmBackedUp){total++};
  427.     if (upBackedUp){total++};
  428.     total += udBackedUp;
  429.  
  430.     var re = new RegExp("\\\\", "g");
  431.     var errCnt = 0;
  432.     var warnCnt = 0;
  433.     var imgstyle = ' height="16" width="16" '
  434.     var table = ['<table border="0" cellpadding="2" cellspacing="2">\n<tbody>',"</tbody>\n</table>"];
  435.     var tr = ["<tr>\n","</tr>\n"];
  436.     var tdnum = ['<td style="vertical-align: middle; text-align: right;"><num>'
  437.             ,"</num></td>\n"];
  438.     var tdimg = ['<td style="text-align: center;">','</td>\n'];
  439.     var tdnolink = ['<td style="font-weight: bold;"><nolink>','</nolink></td>\n'];
  440.     var tdlink = ['<td style="font-weight: bold;">','</td>\n']
  441.     var tdguid = ['<td><guid>','</guid></td>\n'];
  442.     var div = ['<div style="text-align:left; direction: ltr;">\n',"</div>\n"];
  443.     //var disabledIndicator = "<ds> (D)</ds>";
  444.     var disabledIndicator = '<img src="chrome://febe/skin/disabled.png"'+imgstyle+'>';
  445.     
  446.     if (febeDebugMode == true){
  447.         middle += "<i>"+febeMsg[8]+"<br>\n";
  448.         middle += febeMsg[76]+" ";
  449.         middle +=' <a href=\"file://'+febeTmpDir.path.replace(re,"/")+'\">'+ febeTmpDir.path;
  450.         middle +="</a><br></i>\n";
  451.     }//if
  452.     middle += "<p><b>"+febeMsg[12]+"    </b> "+total+" "+febeMsg[13];
  453.     middle += "  <i>("+febeMsg[15]+' <a href=\"file://'+febeExBuDir.replace(re,"/")+'\">'+febeExBuDir+"</a>)</i></p>\n";
  454.     //middle += div[0];
  455.     if ((total) != 0){
  456.         if (numExt != 0){
  457.             middle += "<p>"+febeMsg[14]+" ("+numExt+" "+febeMsg[13]+")\n";
  458.             if(febeDisabledCount != 0){
  459.                 middle += "<i>("+febeMsg[107].replace("%num%",febeDisabledCount)+")</i>\n";
  460.             }else{
  461.                 middle += " - "+febeMsg[120].replace("%disabled%",disabledIndicator)+"\n";
  462.             }//if
  463.             middle += "</p>\n"+div[0]+table[0];
  464.             var item = new febeExtObj;
  465.             for(var i=0; i<febeExtKey.length; i++){
  466.                 var key = febeExtKey[i];
  467.                 item = febeExtensionsList[key];
  468.                 if(item.verified == false){
  469.                     febeErrorList.push(febeMsg[18]+" "+item.Name);
  470.                     errCnt++;
  471.                     continue;
  472.                 }//if
  473.                 cnt++;
  474.                 middle += tr[0];
  475.                 middle += tdnum[0]+cnt+"."+tdnum[1];
  476.                 middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  477.                 var thisExt = new febeExtInfo(item.guid);
  478.                 var tmp = item.Name;
  479.                 if(thisExt.isDisabled){
  480.                     tmp = "<i>"+tmp+"</i>";
  481.                 }else{
  482.                     tmp = tmp;
  483.                 }//if
  484.                 if(item.Home != ""){
  485.                     middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+tdlink[1];
  486.                 }else{
  487.                     middle += tdnolink[0]+tmp+tdnolink[1];
  488.                 }//if    
  489.                 if(febeDebugMode == true){middle += tdguid[0]+"GUID "+item.guid+tdguid[1];}
  490.                 middle += tr[1];
  491.             }//for
  492.             middle += table[1]+div[1];
  493.         }//if
  494.         
  495.         if (numThemes != 0){
  496.             cnt = 0;
  497.             middle += "<p>"+febeMsg[16]+" ("+numThemes+" "+febeMsg[13]+")</p>\n";
  498.             middle += div[0]+table[0];
  499.             var item = new febeExtObj;
  500.             for(var i=0; i<febeThemeKey.length; i++){
  501.                 var key = febeThemeKey[i];
  502.                 item = febeThemesList[key];
  503.                 if(item.verified == false){
  504.                     febeErrorList.push(febeMsg[18]+" "+item.Name);
  505.                     errCnt++;
  506.                     continue;
  507.                 }//if
  508.                 cnt++;
  509.                 middle += tr[0];
  510.                 middle += tdnum[0]+cnt+"."+tdnum[1];
  511.                 middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  512.                 var tmp = item.Name;
  513.                 if(item.Home){
  514.                     middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+tdlink[1];
  515.                 }else{
  516.                     middle += tdnolink[0]+tmp+tdnolink[1];
  517.                 }//if    
  518.                 if(febeDebugMode == true){middle += tdguid[0]+"GUID "+item.guid+tdguid[1];}
  519.                 middle += tr[1];
  520.             }//for
  521.             middle += table[1]+div[1];
  522.         }//if
  523.         //middle += div[1];
  524.     }else{
  525.         febeErrorList.push("<p>"+febeMsg[19]+"</p>\n");
  526.         errCnt++;
  527.     }//if
  528.     
  529.     //middle += div[0]+"<p>";
  530.     middle += "<p>";
  531.     if(!buProfile){
  532.         // Optional backups
  533.         if (buBookmarks){
  534.             if (bmBackedUp){
  535.                 middle +=febeMsg[27]+" <b>"+bmBuName+"</b><br>\n"
  536.             }else{
  537.                 febeErrorList.push(febeMsg[30]);
  538.                 errCnt++;
  539.             }//if
  540.         }//if
  541.         if (buPreferences){
  542.             if (prBackedUp){
  543.                 middle +=febeMsg[28]+" <b>"+prBuName+"</b><br>\n"
  544.             }else{
  545.                 febeWarningList.push(febeMsg[31]);
  546.                 warnCnt++;
  547.             }//if
  548.         }//if
  549.         if (buCookies){
  550.             if (ckBackedUp){
  551.                 middle +=febeMsg[29]+" <b>"+ckBuName+"</b><br>\n"
  552.             }else{
  553.                 febeWarningList.push(febeMsg[32]);
  554.                 warnCnt++;
  555.             }//if    
  556.         }//if    
  557.             if (buUserChrome){
  558.             if (chBackedUp){
  559.                 middle +=febeMsg[52]+" <b>"+chBuName+"</b><br>\n"
  560.             }else{
  561.                 febeWarningList.push(febeMsg[60]);
  562.                 warnCnt++;
  563.             }//if
  564.         }//if    
  565.             if (buUserContent){
  566.             if (ucBackedUp){
  567.                 middle +=febeMsg[53]+" <b>"+ucBuName+"</b><br>\n"
  568.             }else{
  569.                 febeWarningList.push(febeMsg[61]);
  570.                 warnCnt++;
  571.             }//if    
  572.         }//if
  573.             if (buUserPwd){
  574.             if (pwBackedUp){
  575.                 middle +=febeMsg[54]+" <b>"+pwBuName+"</b><br>\n"
  576.             }else{
  577.                 febeWarningList.push(febeMsg[62]);
  578.                 warnCnt++;
  579.             }//if    
  580.         }//if
  581.             if (buPhishingData){
  582.             if (pdBackedUp){
  583.                 middle +=febeMsg[55]+" <b>"+pdBuName+"</b><br>\n"
  584.             }else{
  585.                 febeWarningList.push(febeMsg[63]);
  586.                 warnCnt++;
  587.             }//if
  588.         }//if    
  589.             if (buSearchPlugins){
  590.             if (spBackedUp){
  591.                 middle +=febeMsg[56]+" <b>"+spBuName+"</b><br>\n"
  592.             }else{
  593.                 febeWarningList.push(febeMsg[64]);
  594.                 warnCnt++;
  595.             }//if
  596.         }//if    
  597.             if (buBrowserHistory){
  598.             if (hsBackedUp){
  599.                 middle +=febeMsg[57]+" <b>"+hsBuName+"</b><br>\n"
  600.             }else{
  601.                 febeWarningList.push(febeMsg[65]);
  602.                 warnCnt++;
  603.             }//if
  604.         }//if    
  605.             if (buFormFillHistory){
  606.             if (ffBackedUp){
  607.                 middle +=febeMsg[58]+" <b>"+ffBuName+"</b><br>\n"
  608.             }else{
  609.                 febeWarningList.push(febeMsg[66]);
  610.                 warnCnt++;
  611.             }//if
  612.         }//if    
  613.             if (buPermissions){
  614.             if (pmBackedUp){
  615.                 middle +=febeMsg[116]+" <b>"+pmBuName+"</b><br>\n"
  616.             }else{
  617.                 febeWarningList.push(febeMsg[115]);
  618.                 warnCnt++;
  619.             }//if
  620.         }//if    
  621.         if (buUDBu){
  622.             for(var i in febeUDBuDone){
  623.                 var item = new febeUDBuDoneObj;
  624.                 item.Description = febeUDBuDone[i].Description;
  625.                 item.Name = febeUDBuDone[i].Name;
  626.                 var tmp = febeMsg[148].replace("%description%","\""+item.Description+"\"");
  627.                 tmp = tmp.replace("%name%"," <b>"+item.Name+"</b><br>\n");
  628.                 middle += tmp;
  629.             }//for
  630.         }//if    
  631.     }else{    // Full profile
  632.         if (upBackedUp){
  633.             middle +=febeMsg[59]+" <b>"+upBuName+"</b><br>\n"
  634.         }else{
  635.             febeErrorList.push(febeMsg[67]);
  636.             errCnt++;
  637.         }//if    
  638.     }//if
  639.     //middle += "</p>\n"+div[1];
  640.     middle += "</p>\n";
  641.     
  642.   // Write the final results
  643.     var pageSource = resultsTemplate.replace("%title%", febeMsg[108]);
  644.     pageSource = pageSource.replace("%reportheading%", febeMsg[109]);
  645.     pageSource = pageSource.replace("%version%", febeVersion);
  646.     pageSource = pageSource.replace("%by%", febeMsg[180]);
  647.     pageSource = pageSource.replace("%results%", middle);
  648.     var prefName = "extensions.febe.orientation";
  649.     var orientation = febePrefs.getCharPref(prefName);
  650. //orientation = "rtl"
  651.     pageSource = pageSource.replace("%orientation%", orientation);
  652.     middle = "";
  653.     if(errCnt != 0){
  654.         pageSource = pageSource.replace("%errmsg%", "<errh>"+errCnt+" "+febeMsg[112]+"</errh>");
  655.         middle = div[0];
  656.         for(var i=0; i<febeErrorList.length; i++){
  657.             middle += "<err>"+febeErrorList[i]+"</err><br>\n";
  658.         }//for
  659.         middle += div[1];
  660.         pageSource = pageSource.replace("%errlist%", middle);
  661.     }else{
  662.         pageSource = pageSource.replace("%errmsg%<br>", "<!-- %errmsg% -->\n");
  663.         pageSource = pageSource.replace("%errlist%<br>", "<!-- %errlist% -->\n");
  664.     }//if
  665.     if(warnCnt != 0){
  666.         pageSource = pageSource.replace("%warnmsg%", "<warnh>"+warnCnt+" "+febeMsg[132]+"</warnh>");
  667.         middle = div[0];
  668.         for(var i=0; i<febeWarningList.length; i++){
  669.             middle += "<warn>"+febeWarningList[i]+"</warn><br>\n";
  670.         }//for
  671.         middle += div[1];
  672.         pageSource = pageSource.replace("%warnlist%", middle);
  673.     }else{
  674.         pageSource = pageSource.replace("%warnmsg%<br>", "<!-- %warnmsg% -->\n");
  675.         pageSource = pageSource.replace("%warnlist%<br>", "<!-- %warnlist% -->\n");
  676.     }//if
  677.     pageSource = pageSource.replace("%hompagemsg%", febeMsg[110]);
  678.     pageSource = pageSource.replace("%linkmsg%", febeMsg[111]);
  679.     
  680.     // Create an UTF-8 output stream
  681.     var charset = "UTF-8";
  682.     var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
  683.              .createInstance(Components.interfaces.nsIConverterOutputStream);
  684.  
  685.     os.init(resultsFile, charset, 4096, 0x0000);
  686.     os.writeString(pageSource);
  687.     os.close();
  688.     
  689.   // Open and display results
  690.     if(errCnt == 0){
  691.         febePlaySound("success");
  692.     }else{
  693.         febePlaySound("failure");
  694.     }//if
  695.     // Thanks to menet for providing the code to display the results page in an unused tab
  696.     // if one is availble.
  697.     var finalPage = "file:///"+febeResultsPage.path
  698.     if(febeDispResults){
  699.         var currBlank = (getBrowser() &&
  700.         (getBrowser().mCurrentTab.linkedBrowser &&
  701.         (getBrowser().mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  702.         (!getBrowser().mCurrentTab.linkedBrowser &&
  703.         (getBrowser().mCurrentTab.label == "(Untitled)")));
  704.         if (currBlank){
  705.             var resultsWindow = loadURI(finalPage);
  706.         }else{
  707.             var resultsWindow = openNewTabWith(finalPage, this.docURL, null, null);
  708.         }//if
  709.     }//if
  710.     return true;
  711. }//febeWriteResults()
  712.  
  713. function febeWarn(){
  714.   // Display scheduled backup warning in statusbar
  715.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  716.            .getService(Components.interfaces.nsIWindowMediator);
  717.     var win = wm.getMostRecentWindow("navigator:browser");
  718.     var d = win.document.getElementById("febestatusbar");
  719.     d.setAttribute("status","warning");
  720.     febePlaySound("warning");
  721.     for(var i=10000; i<= 40000; i += 10000){
  722.         var to = new febeSetTimeoutObj;
  723.         to.PID = setTimeout('febePlaySound("warning")',i)
  724.         to.Process = 'febePlaySound("warning")';
  725.         febeSetTimeoutID.push(to);
  726.     }//for
  727.     return true;
  728. }//febeWarn()
  729.  
  730. function febeStripSpaces(extName){
  731.   // Remove spaces and undesirable characters from extension name
  732.     var tmp = "";
  733.     var mask = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  734.     mask += ".+-_";
  735.     for (var i = 0; i <= extName.length; i++){
  736.         var c = extName.charAt(i);
  737.         if( mask.indexOf(c) != -1 ){tmp += c};
  738.     }//for
  739.     return tmp;
  740. }//febeStripSpaces()
  741.  
  742. function febeDebug(aMsg) {
  743.    setTimeout(function() { throw new Error("[debug] " + aMsg); }, 0);
  744.    return true;
  745. }//debug
  746.  
  747. function febePickFiles(filter,msgNum){
  748.   // Select extension/themes to install
  749.     const nsIFilePicker = Components.interfaces.nsIFilePicker;
  750.     var fp = Components.classes["@mozilla.org/filepicker;1"]
  751.              .createInstance(nsIFilePicker);
  752.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpenMultiple);
  753.     fp.appendFilter(filter,filter);
  754.     
  755.     // Set the default directory to the backup destination directory
  756.     var prefName = "extensions.febe.extBUdir";
  757.     if(!febePrefs.prefHasUserValue(prefName)){
  758.         febeGetPrefs();
  759.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  760.         if(febePlatform == 2){febeExBuDir = "/";}
  761.         if(febePlatform == 3){febeExBuDir = "/";}
  762.     }else{
  763.         febeExBuDir = febeGetUnicharPref(prefName);
  764.     }//if
  765.     
  766.     if(febeExBuDir != ""){
  767.         var aDir = Components.classes["@mozilla.org/file/local;1"]
  768.             .createInstance(Components.interfaces.nsILocalFile);
  769.         aDir.initWithPath(febeExBuDir);
  770.         fp.displayDirectory = aDir;
  771.     }//if
  772.  
  773.     var rv = fp.show();
  774.     febeETinstall = [];
  775.     if (rv == nsIFilePicker.returnOK){
  776.         var files = fp.files;
  777.         while(files.hasMoreElements()) {
  778.             var file = files.getNext()
  779.                 .QueryInterface(Components.interfaces.nsILocalFile);
  780.             var obj = new febeExtObj;
  781.             obj.Name = file.leafName;
  782.             obj.Path = file.path;
  783.             febeETinstall.push(obj);
  784.         }//while
  785.     }//if
  786.     return true;
  787. }//febePickFiles()
  788.  
  789. function febeStartBackup(){
  790. //alert("febeStartBackup");
  791.     if(febeBuInProgress == true){
  792.         febeBuInProgress = false;
  793.         return true;
  794.     }//if
  795.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  796.            .getService(Components.interfaces.nsIWindowMediator);
  797.     var win = wm.getMostRecentWindow("navigator:browser");
  798.     if(win.document.getElementById("febeTLBRbutton")){
  799.         win.document.getElementById("febeTLBRbutton").status = "disabled";
  800.         win.document.getElementById("febeTLBRbutton").hidden = "true";
  801.     }//if
  802.     if(win.document.getElementById("febestatusbar")){
  803.         win.document.getElementById("febestatusbar").hidden = true;
  804.     }//if
  805.     febeBuInProgress = true;
  806.     if(febeDispProgress == true){
  807.         // Open the progress window
  808.         febeWin = openDialog("chrome://febe/content/febeProgress.xul", "FEBE", "chrome,dependent,alwaysRaised,centerscreen,dialog='no'");
  809.         // Give the browser a chance to display the progress window before the backup starts
  810.         setTimeout('doFebeBackup()',1000);
  811.     }else{
  812.         doFebeBackup();
  813.     }//if
  814.     win.document.getElementById("febestatusbar").class = "statusbarpanel-iconic febe-normal";
  815.     win.document.getElementById("febestatusbar").hidden = false;
  816.     win.document.getElementById("febeTLBRbutton").setAttribute("status","normal");
  817.     win.document.getElementById("febeTLBRbutton").setAttribute("hidden","false");
  818.     return true;
  819. }//febeStartBackup()
  820.  
  821. function getFebeResultsTemplate(aURL){
  822.     var req = new XMLHttpRequest();
  823.     req.open('GET', aURL, false);
  824.     req.send(null);
  825.     return req.responseText;
  826. }//getFebeResultsTemplate()
  827.  
  828. function febeCopyFile(sourcefile,destdir,dName){
  829.     if(dName == "parent.lock"){return true;}    // File is locked
  830.   // get a component for the file to copy
  831.     var aFile = Components.classes["@mozilla.org/file/local;1"]
  832.         .createInstance(Components.interfaces.nsILocalFile);
  833.     if (!aFile) return false;
  834.  
  835.   // get a component for the directory to copy to
  836.     var aDir = Components.classes["@mozilla.org/file/local;1"]
  837.         .createInstance(Components.interfaces.nsILocalFile);
  838.     if (!aDir) return false;
  839.  
  840.   // next, assign URLs to the file components
  841.     aFile.initWithPath(sourcefile);
  842.     aDir.initWithPath(destdir);
  843.     
  844.   // delete the destination file if it exists
  845.     var oFile = Components.classes["@mozilla.org/file/local;1"]
  846.         .createInstance(Components.interfaces.nsILocalFile);
  847.     oFile.initWithPath(destdir);
  848.     oFile.append(dName);
  849.     try{
  850.         oFile.remove(false);
  851.     }catch(e){
  852.         //alert(e);
  853.     }
  854.         
  855.   // finally, copy the file, renaming it
  856.     try{
  857.         aFile.copyTo(aDir,dName);
  858.     }catch(e){
  859.         //if(febeIgnoreError == true){return true};
  860.         var msg = febeMsg[168].replace("%sourcefile%",sourcefile+"\n");
  861.         msg = msg.replace("%destdir%",destdir+"\n");
  862.         msg = msg.replace("%dName%",dName);
  863.         febeFatal(e,msg);
  864.         return false;
  865.     }
  866.     return true;
  867. }//febeCopyFile
  868.  
  869. function febeDirCopy(sourceDir){
  870. // Recursively copy individual files and sub-directories to a destination directory
  871. // 
  872. // Example:
  873. //    sourceDir (intially) = [profiledir]/extensions
  874. //    febeSubRootDir = {4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  875. //    febeDestDir = nsIFile to [temp]/febe.tmp
  876. //
  877. //        All files and sub-directories in [profiledir]/extensions/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  878. //        will be copied to [temp]/febe.tmp/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  879.  
  880.     var tmp = "sourceDir: "+sourceDir;
  881.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  882.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  883.  
  884.     var aFile = Components.classes["@mozilla.org/file/local;1"]
  885.         .createInstance(Components.interfaces.nsILocalFile);
  886.     if (!aFile) return false;
  887.  
  888.     aFile.initWithPath(sourceDir);
  889.     var entries = aFile.directoryEntries;
  890.     
  891.     while(entries.hasMoreElements()){
  892.         var entry = entries.getNext();
  893.         entry.QueryInterface(Components.interfaces.nsIFile);
  894.         var src = entry.path;
  895.         var p = src.indexOf(febeSubRootDir)
  896.         if(p == -1){continue;}
  897.         if(entry.isDirectory()){
  898.             febeDirCopy(src);
  899.         }else{
  900.             var parentPath = entry.parent.path;
  901.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  902.             var file = entry.leafName;
  903.             febeCopyFile(src,dest,file);
  904.         }//if
  905.     }//while
  906.     return true;
  907. }//febeDirCopy()
  908.  
  909. function febePickFile(filter,msgNum){
  910.   // Select a file to restore
  911.     const nsIFilePicker = Components.interfaces.nsIFilePicker;
  912.     var fp = Components.classes["@mozilla.org/filepicker;1"]
  913.                     .createInstance(nsIFilePicker);
  914.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpen);
  915.     fp.appendFilter(filter,filter);
  916.     
  917.     // Set the default directory to the backup destination directory
  918.     var prefName = "extensions.febe.extBUdir";
  919.     if(!febePrefs.prefHasUserValue(prefName)){
  920.         febeGetPrefs();
  921.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  922.         if(febePlatform == 2){febeExBuDir = "/";}
  923.         if(febePlatform == 3){febeExBuDir = "/";}
  924.     }else{
  925.         febeExBuDir = febeGetUnicharPref(prefName);
  926.     }//if
  927.     if(febeExBuDir != ""){
  928.         var aDir = Components.classes["@mozilla.org/file/local;1"]
  929.             .createInstance(Components.interfaces.nsILocalFile);
  930.         aDir.initWithPath(febeExBuDir);
  931.         fp.displayDirectory = aDir;
  932.     }//if
  933.  
  934.     var rv = fp.show();
  935.     if (rv == nsIFilePicker.returnOK){
  936.         rv = fp.file;
  937.         febePathName = rv.path;
  938.         febePrName = rv.leafName;        // Used in restore profile
  939.         return true;
  940.     }//if
  941.     return false;
  942. }//febePickFile()
  943.  
  944. function febeConfirmRestore(msgNum,bDate){
  945.     var style = "<style>color: red;font-size: 14pt;</style>";
  946.     var tmp = style+febeMsg[36] +"\n";
  947.     tmp += febeMsg[msgNum] + "\n";
  948.     tmp += febeLocalizedDate(bDate) +"\n\n";
  949.     tmp += febeMsg[45] + "\n" + febeMsg[40];
  950.     tmp += "\n" + febeMsg[41];
  951.     return febeConfirm(tmp);
  952. }//febeConfirmRestore()
  953.  
  954. function febeGetBuDate(filename){
  955.     var oFile = Components.classes["@mozilla.org/file/local;1"]
  956.         .createInstance(Components.interfaces.nsILocalFile);
  957.     oFile.initWithPath(filename);
  958.     febeBUdate = new Date(oFile.lastModifiedTime);
  959.     return true;
  960. }//febeGetBuDate()
  961.  
  962. function febeGoBatch(batchFileName,batchlines){
  963.     febeUpdateProgressWindow(batchFileName);
  964.     switch (febePlatform) {
  965.             case 1: return febeGoBatchWin(batchFileName,batchlines); break;    // Windows
  966.             case 2: return febeGoBatchNix(batchFileName,batchlines); break;    // Unix
  967.             case 3: return febeGoBatchMac(batchFileName,batchlines); break;    // Mac
  968.             default: return false;
  969.     }//switch
  970. }//febeGoBatch()
  971.  
  972.  
  973. function febeGoBatchWin(batchFileName,batchlines){    // Run the windows script
  974.   // Create the batch file, open it for write, assign it to a UTF-8 output stream
  975.   try{
  976.     var febeBatch = febeTmpDir.clone();
  977.     febeBatch.append(batchFileName+febeBuSeq+".bat");
  978.     febeBatch.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0755);
  979.     febeBatch = febeBatch.clone();
  980.     
  981.     var febeBatchFile = Components.classes["@mozilla.org/network/file-output-stream;1"]
  982.         .createInstance(Components.interfaces.nsIFileOutputStream);
  983.     febeBatchFile.init(febeBatch, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  984.     
  985.     var charset = "UTF-8";
  986.     var osBatchFile = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
  987.                      .createInstance(Components.interfaces.nsIConverterOutputStream);
  988.     osBatchFile.init(febeBatchFile, charset, 4096, 0x0000);
  989.   
  990.   // Build the batch file
  991.     batchlines.unshift("@TITLE "+febeMsg[26]+" "+batchFileName+febeExtExt);
  992.     batchlines.unshift("@PROMPT FEBE: ");
  993.     if(febeDebugMode == true){batchlines.push("@PAUSE");}
  994.     batchlines.push("EXIT");
  995.  
  996.     osBatchFile.writeString(batchlines.join(febeNLchar));
  997.     osBatchFile.close();
  998.     febeMakeExecutable(febeBatch.path);
  999.     
  1000.   // Run the batch file
  1001.     var file = Components.classes["@mozilla.org/file/local;1"]
  1002.             .createInstance(Components.interfaces.nsILocalFile);
  1003.  
  1004.     file.initWithPath(FEBEbg.path);
  1005.     process = Components.classes["@mozilla.org/process/util;1"]
  1006.                         .createInstance(Components.interfaces.nsIProcess);
  1007.     process.init(file);
  1008.     // freeze until zipping is complete
  1009.     var quote = "\"";
  1010.     var vbWindowOpt = "0,";
  1011.     if(febeDebugMode == true){vbWindowOpt = "1,";}
  1012.     var argv = [vbWindowOpt,febeBatch.path];
  1013.     
  1014.     //setTimeout("process.run(true, argv, argv.length)",500);
  1015.     process.run(true, argv, argv.length);
  1016.     return true;
  1017.   }catch(e){
  1018.     var msg = febeMsg[169];
  1019.     febeFatal(e,msg);
  1020.     return false;}
  1021. }//febeGoBatchWin()
  1022.  
  1023. function febeVerify(verifyFileName){
  1024.   // Verify backup was created
  1025.     if(febeBuInProgress == false){return true;} // Don't verify restores
  1026.     if(febeVerifyBackups == false){return true;}
  1027.     
  1028.     // Check for existance of backup file every second for a maximum of 10 seconds
  1029.     for(var i=0; i<5; i++){ 
  1030.         var chkFile = febeBuDesDir.clone();
  1031.         chkFile.append(verifyFileName);
  1032.         if(chkFile.exists()){return true;}
  1033.         febePause(1000);
  1034.     }//for    
  1035.     return false;
  1036. }//febeVerify()
  1037.  
  1038. function febeGoBatchNix(batchFileName,batchlines){    // Run the *nix script
  1039.   // Create the batch file, open it for write, assign it to a UTF-8 output stream
  1040.   try{
  1041.     var febeBatch = febeTmpDir.clone();
  1042.     febeBatch.append(batchFileName+febeBuSeq+".sh");
  1043.     febeBatch.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0755);
  1044.     febeBatch = febeBatch.clone();
  1045.     
  1046.     var febeBatchFile = Components.classes["@mozilla.org/network/file-output-stream;1"]
  1047.         .createInstance(Components.interfaces.nsIFileOutputStream);
  1048.     febeBatchFile.init(febeBatch, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1049.     
  1050.     var charset = "UTF-8";
  1051.     var osBatchFile = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
  1052.                      .createInstance(Components.interfaces.nsIConverterOutputStream);
  1053.     osBatchFile.init(febeBatchFile, charset, 4096, 0x0000);
  1054.     
  1055.   // Build the batch file
  1056.     batchlines.unshift("echo "+febeMsg[26]+" "+batchFileName+febeExtExt);
  1057.     batchlines.unshift("PS1=FEBE: ");
  1058.     batchlines.unshift("pwd");
  1059.     //if(febeDebugMode == true){batchlines.push("read ");}
  1060.     batchlines.push("exit");
  1061.     
  1062.     osBatchFile.writeString(batchlines.join(febeNLchar));
  1063.     osBatchFile.close();
  1064.     febeMakeExecutable(febeBatch.path);
  1065.     
  1066.   // Run the batch file
  1067.     var file = Components.classes["@mozilla.org/file/local;1"]
  1068.             .createInstance(Components.interfaces.nsILocalFile);    
  1069.     file.initWithPath("/");
  1070.     file.append("bin");
  1071.     file.append("sh");
  1072.     var process = Components.classes["@mozilla.org/process/util;1"]
  1073.                         .createInstance(Components.interfaces.nsIProcess);
  1074.     process.init(file);
  1075.  
  1076.     // freeze until zipping is complete
  1077.     var argv = ["-cv","\""+febeBatch.path+"\""];
  1078.     
  1079.     //setTimeout("yourfunction()",1000);
  1080.     process.run(true, argv, argv.length);    
  1081.     return true;
  1082.   }catch(e){
  1083.     var msg = febeMsg[169];
  1084.     febeFatal(e,msg);
  1085.     return false;}
  1086. }//febeGoBatchNix()
  1087.  
  1088. function febeGoBatchMac(batchFileName,batchlines){    // Run the Mac script
  1089.   // Create the batch file, open it for write, assign it to a UTF-8 output stream
  1090.   try{
  1091.     var febeBatch = febeTmpDir.clone();
  1092.     febeBatch.append(batchFileName+febeBuSeq+".sh");
  1093.     febeBatch.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0755);
  1094.     febeBatch = febeBatch.clone();
  1095.     
  1096.     var febeBatchFile = Components.classes["@mozilla.org/network/file-output-stream;1"]
  1097.         .createInstance(Components.interfaces.nsIFileOutputStream);
  1098.     febeBatchFile.init(febeBatch, 0x02 | 0x08 | 0x20, 0777, 0); // write, create, truncate
  1099.     
  1100.     var charset = "UTF-8";
  1101.     var osBatchFile = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
  1102.                      .createInstance(Components.interfaces.nsIConverterOutputStream);
  1103.     osBatchFile.init(febeBatchFile, charset, 4096, 0x0000);
  1104.     
  1105.   // Build the batch file
  1106.     batchlines.unshift("echo "+febeMsg[26]+" "+batchFileName+febeExtExt);
  1107.     batchlines.unshift("PS1=FEBE: ");
  1108.     batchlines.unshift("pwd");
  1109.     //if(febeDebugMode == true){batchlines.push("read ");}
  1110.     batchlines.push("exit");
  1111.     
  1112.     osBatchFile.writeString(batchlines.join(febeNLchar));
  1113.     osBatchFile.close();
  1114.     febeMakeExecutable(febeBatch.path);
  1115.     
  1116.   // Run the batch file
  1117.     var file = Components.classes["@mozilla.org/file/local;1"]
  1118.             .createInstance(Components.interfaces.nsILocalFile);    
  1119.     file.initWithPath("/");
  1120.     file.append("bin");
  1121.     file.append("sh");
  1122.     var process = Components.classes["@mozilla.org/process/util;1"]
  1123.                         .createInstance(Components.interfaces.nsIProcess);
  1124.     process.init(file);
  1125.  
  1126.     // freeze until zipping is complete
  1127.     var argv = ["-cv","\""+febeBatch.path+"\""];
  1128.     
  1129.     //setTimeout("yourfunction()",1000);
  1130.     process.run(true, argv, argv.length);    
  1131.     return true;
  1132.   }catch(e){
  1133.     var msg = febeMsg[169];
  1134.     febeFatal(e,msg);
  1135.     return false;}
  1136. }//febeGoBatchMac()
  1137.  
  1138. function febeRestartFx(){
  1139.     // Borrowed from Jed Brown's "Restart Firefox" extension
  1140.     a = Components.interfaces.nsIAppStartup,Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(a).quit(a.eRestart | a.eAttemptQuit);
  1141.     return true;
  1142. }//febeRestartFx()
  1143.  
  1144. function febePause(millis){
  1145.     date = new Date();
  1146.     var curDate = null;
  1147.  
  1148.     do { var curDate = new Date(); }
  1149.         while(curDate-date < millis);
  1150.     return true;
  1151. }//febePause()
  1152.  
  1153. function febeUpdateProgressWindow(pMsg){
  1154.     if(febeBuInProgress == false){return true;}
  1155.     if(febeDispProgress == false){return true;}
  1156.     var pMsgField = febeWin.document.getElementById("febeProgressText");
  1157.     pMsgField.setAttribute("value",pMsg);
  1158.     return true;
  1159. }//febeUpdateProgressWindow()
  1160.  
  1161. function febePauseUI(){
  1162.     //alert("updating progress window");
  1163.     //setTimeout(';',500);
  1164.     //febeWin.moveBy(5,5);
  1165.     febeWin.refresh();
  1166.     //febePause(1000);
  1167.     return true;
  1168. }//febePauseUI
  1169.  
  1170. function febeInitDir(){
  1171.     exBackedUp = false;
  1172.     thBackedUp = false;
  1173.     bmBackedUp = false;
  1174.     prBackedUp = false;
  1175.     ckBackedUp = false;
  1176.     chBackedUp = false;
  1177.     ucBackedUp = false;
  1178.     pwBackedUp = false;
  1179.     pdBackedUp = false;
  1180.     spBackedUp = false;
  1181.     hsBackedUp = false;
  1182.     ffBackedUp = false;
  1183.     pmBackedUp = false;
  1184.     upBackedUp = false;
  1185.     
  1186.     // Get platform
  1187.     febePlatform = febeGetPlatform();
  1188.     
  1189.   // Create pointers to needed directories
  1190.     // Create a temporary directory to work in
  1191.     febeGetTmpDirectory(true);
  1192.  
  1193. // Get pointer to FEBE extension directory
  1194.     FEBEdir = Components.classes["@mozilla.org/extensions/manager;1"]
  1195.               .getService(Components.interfaces.nsIExtensionManager)
  1196.               .getInstallLocation(FEBE_GUID)
  1197.               .getItemLocation(FEBE_GUID);
  1198.     
  1199.     // Get pointers to zip and unzip files
  1200.     febeZipFile = FEBEdir.clone();
  1201.     febeUnZipFile = FEBEdir.clone();
  1202.    
  1203.     switch (febePlatform) {
  1204.         case 1:    // Windows
  1205.             febeNLchar = "\r\n";    // Windows CF-LF
  1206.             febeSetUnicharPref("extensions.febe.winpathzip",febeZipFile.path);    
  1207.             febeSetUnicharPref("extensions.febe.winpathunzip",febeUnZipFile.path);
  1208.             febeZipFile.append(FEBEWINZIPFILENAME);
  1209.             febeUnZipFile.append(FEBEWINUNZIPFILENAME);        
  1210.             break;
  1211.         case 2: // *nix
  1212.             febeNLchar = "\n";    // Linux LF
  1213.             febeSetUnicharPref("extensions.febe.nixpathzip",febeZipFile.path);    
  1214.             febeSetUnicharPref("extensions.febe.nixpathunzip",febeUnZipFile.path);
  1215.             febePrefs.setBoolPref("extensions.febe.chmodok",false);
  1216.             febeZipFile.append(FEBENIXZIPFILENAME);
  1217.             febeUnZipFile.append(FEBENIXUNZIPFILENAME);    
  1218.             var isOk = (febeUnZipFile.isExecutable() && febeZipFile.isExecutable());
  1219.             if(!isOk){
  1220.                 febeChmodWindow();
  1221.                 if(febePrefs.getBoolPref("extensions.febe.chmodok") == false){return false;}
  1222.             }//if
  1223.             break;
  1224.         case 3: // Mac
  1225.             febeNLchar = "\n";    // Mac LF
  1226.             febeSetUnicharPref("extensions.febe.macpathzip",febeZipFile.path);    
  1227.             febeSetUnicharPref("extensions.febe.macpathunzip",febeUnZipFile.path);
  1228.             febePrefs.setBoolPref("extensions.febe.chmodok",false);
  1229.             febeZipFile.append(FEBEMACZIPFILENAME);
  1230.             febeUnZipFile.append(FEBEMACUNZIPFILENAME);    
  1231.             var isOk = (febeUnZipFile.isExecutable() && febeZipFile.isExecutable());
  1232.             if(!isOk){
  1233.                 febeChmodWindow();
  1234.                 if(febePrefs.getBoolPref("extensions.febe.chmodok") == false){return false;}
  1235.             }//if
  1236.             break;
  1237.     }//switch
  1238.  
  1239.     febeCopyZips();
  1240.     
  1241.     if(febeInitialized == true){return true;}    // Only run the rest of this routine once
  1242.     febeInitialized = true;    
  1243.     
  1244.     // Create a log file in the temporary directory
  1245.     var logFile = febeTmpDir.clone();
  1246.     logFile.append("febe.log");
  1247.     logFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0755);
  1248.     
  1249.     // Get the batch sequence number.  ex: "febe-8.log", febeBuSeq = "-8"
  1250.     var tmp = logFile.leafName;
  1251.     febeBuSeq = "";
  1252.     var p1 = tmp.indexOf("-");
  1253.     if (p1 != -1){
  1254.         var p2 =  tmp.indexOf(".log");
  1255.         febeBuSeq = tmp.slice(p1,p2);
  1256.     }//if
  1257.     logFile.remove(false);
  1258.     
  1259.     // Create pointer to profile directory
  1260.     febeProfDir = Components.classes["@mozilla.org/file/directory_service;1"]
  1261.         .getService(Components.interfaces.nsIProperties)
  1262.         .get("ProfD", Components.interfaces.nsIFile);
  1263.  
  1264.     // Get profile name
  1265.     var tmp = "";
  1266.     for (i = febeProfDir.path.length; i > 0; i--){
  1267.         var c = febeProfDir.path.charAt(i);
  1268.         var delimiter = "\\"
  1269.         if(febePlatform == 2){delimiter = "/";}    // *nix
  1270.         if(febePlatform == 3){delimiter = "/";}    // Mac
  1271.         if( c == delimiter ){
  1272.             break;
  1273.         }else{
  1274.             tmp = c + tmp;
  1275.         }
  1276.     }//for
  1277.     var p = tmp.indexOf(".")
  1278.     febeProfName  = tmp.substr(p+1);
  1279.     //febeProfName = febeDosHappy(febeProfName);
  1280.         
  1281.     // Get pointer to background script runner
  1282.     FEBEbg = FEBEdir.clone();
  1283.     if(febePlatform == 1){  // Windows
  1284.         FEBEbg.append("FEBEbg.exe");    
  1285.     }else{
  1286.         //FEBEbg = "/bin/sh";    
  1287.     }//if
  1288.     return true;
  1289. }//febeInitDir()
  1290.  
  1291. function febeChmodWindow(){
  1292.     if(!febeDisablePermChk){
  1293.         return openDialog("chrome://febe/content/febeChmod.xul", "FEBE", "chrome,modal,resizable");    
  1294.     }else{
  1295.         febePrefs.setBoolPref("extensions.febe.chmodok",true);
  1296.         return true;
  1297.     }//if
  1298. }//febeChmodWindow()
  1299.  
  1300. function febeClearDir(){
  1301.    // Clear destination directory
  1302.     if(febeClearDestDir == false){return true;}
  1303.     var entries = febeBuDesDir.directoryEntries;
  1304.     var numFiles = 0;
  1305.     var numDirs = 0;
  1306.     while(entries.hasMoreElements()){
  1307.         var entry = entries.getNext();
  1308.         entry.QueryInterface(Components.interfaces.nsIFile);
  1309.         if(entry.isFile()){numFiles++;}
  1310.         if(entry.isDirectory()){numDirs++;}
  1311.     }//while
  1312.  
  1313.     // Warn before delete?
  1314.     var clearWarning = new Boolean(false);
  1315.     var prefName = "extensions.febe.clearwarning";
  1316.     if(febePrefs.prefHasUserValue(prefName)){
  1317.         clearWarning = febePrefs.getBoolPref(prefName);
  1318.     } else {
  1319.         febePrefs.setBoolPref(prefName,true);
  1320.         clearWarning = false;
  1321.     }//if
  1322.     
  1323.     if((clearWarning) && numFiles != 0){
  1324.         var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  1325.                         .getService(Components.interfaces.nsIPromptService);
  1326.         var checkResult = {};
  1327.  
  1328.         var x1 = new RegExp("x1");
  1329.         var x2 = new RegExp("x2");
  1330.         var tmp = febeMsg[99];
  1331.         tmp = tmp.replace(x1,numFiles);
  1332.         tmp = tmp.replace(x2,numDirs);
  1333.         tmp += "\n"+febeMsg[100];
  1334.     
  1335.         //var OK = promptService.confirm(window,febeMsg[98],tmp)
  1336.         var OK = febeConfirm(tmp);
  1337.         if(!OK){return false;}
  1338.     }//if
  1339.     
  1340.     var entries = febeBuDesDir.directoryEntries;
  1341.     while(entries.hasMoreElements()){
  1342.         var entry = entries.getNext();
  1343.         entry.QueryInterface(Components.interfaces.nsIFile);
  1344.         if(entry.isFile()){entry.remove(false);}
  1345.     }//while
  1346.     return true;
  1347. }//febeClearDir()
  1348.  
  1349. function febeSetExDir(){    // Get/show the path to the executables
  1350.     febePlatform = febeGetPlatform();
  1351.     if(febePlatform == 1){
  1352.         document.getElementById("febeZipValue").value = FEBEWINZIPFILENAME;
  1353.         document.getElementById("febeUnzipValue").value = FEBEWINUNZIPFILENAME;    
  1354.         document.getElementById("febeExtDirZip").value = febePrefs.getCharPref("extensions.febe.winpathzip");
  1355.     }//if
  1356.     if(febePlatform == 2){
  1357.         document.getElementById("febeZipValue").value = FEBENIXZIPFILENAME;
  1358.         document.getElementById("febeUnzipValue").value = FEBENIXUNZIPFILENAME;    
  1359.         document.getElementById("febeExtDirZip").value = febePrefs.getCharPref("extensions.febe.nixpathzip");
  1360.     }//if
  1361.     if(febePlatform == 3){
  1362.         document.getElementById("febeZipValue").value = FEBEMACZIPFILENAME;
  1363.         document.getElementById("febeUnzipValue").value = FEBEMACUNZIPFILENAME;    
  1364.         document.getElementById("febeExtDirZip").value = febePrefs.getCharPref("extensions.febe.macpathzip");
  1365.     }//if
  1366.     return true;
  1367. }//febeSetExDir()
  1368.  
  1369. function febeChmod(){
  1370.     febePlatform = febeGetPlatform();
  1371.     if(febePlatform == 1){return};
  1372.   // Try to change permissions
  1373.     if (febePlatform == 2) {
  1374.         var febeZipExecutable = FEBENIXZIPFILENAME;
  1375.         var febeUnZipExecutable = FEBENIXUNZIPFILENAME;
  1376.         var febeZipExecutablePath = febePrefs.getCharPref("extensions.febe.nixpathzip");
  1377.         febeZipExecutablePath += "/"+    febeZipExecutable;
  1378.         var febeUnZipExecutablePath = febePrefs.getCharPref("extensions.febe.nixpathunzip");
  1379.         febeUnZipExecutablePath += "/"+ febeUnZipExecutable;
  1380.     }else{    
  1381.         var febeZipExecutable = FEBEMACZIPFILENAME;
  1382.         var febeUnZipExecutable = FEBEMACUNZIPFILENAME;
  1383.         var febeZipExecutablePath = febePrefs.getCharPref("extensions.febe.macpathzip");
  1384.         febeZipExecutablePath += "/"+    febeZipExecutable;
  1385.         var febeUnZipExecutablePath = febePrefs.getCharPref("extensions.febe.macpathunzip");
  1386.         febeUnZipExecutablePath += "/"+ febeUnZipExecutable; 
  1387.     }//if
  1388.  
  1389.     var file = Components.classes["@mozilla.org/file/local;1"]
  1390.             .createInstance(Components.interfaces.nsILocalFile);    
  1391.     file.initWithPath("/");
  1392.     file.append("bin");
  1393.     file.append("chmod");
  1394.     var process = Components.classes["@mozilla.org/process/util;1"]
  1395.                         .createInstance(Components.interfaces.nsIProcess);
  1396.     process.init(file);
  1397.  
  1398.     var argv = ["0755",febeZipExecutablePath,febeUnZipExecutablePath];
  1399.     
  1400.     process.run(true, argv, argv.length);    
  1401.     
  1402.     FEBEdir = Components.classes["@mozilla.org/extensions/manager;1"]
  1403.               .getService(Components.interfaces.nsIExtensionManager)
  1404.               .getInstallLocation(FEBE_GUID)
  1405.               .getItemLocation(FEBE_GUID);
  1406.     febeZipFile = FEBEdir.clone();
  1407.     febeUnZipFile = FEBEdir.clone();
  1408.     febeZipFile.append(febeZipExecutable);
  1409.     febeUnZipFile.append(febeUnZipExecutable);
  1410.     
  1411.     var isOk = (febeUnZipFile.isExecutable() && febeZipFile.isExecutable());
  1412.     if(isOk == true){
  1413.         febeAlert(febeMsg[104]);
  1414.         febePrefs.setBoolPref("extensions.febe.chmodok",true);
  1415.         return true;
  1416.     }else{
  1417.         var style = "<style>color: red;font-size: 12pt;</style>";
  1418.         var tmp = style+febeMsg[105]+"\n\n";
  1419.         style = "<style>color: black;font-size: 10pt;</style>";
  1420.         tmp += style+febeMsg[177]+"\n";
  1421.         tmp += style+febeMsg[178]+"\n";
  1422.         febeAlert(tmp);
  1423.         febePrefs.setBoolPref("extensions.febe.chmodok",false);
  1424.         return false;
  1425.     }//if    
  1426. }//febeChmod()
  1427.  
  1428. function febeDosHappy(aString){
  1429.     // Mask out DOS incompatable characters
  1430.     if(febePlatform != 1){return aString;}
  1431.     var goodList = " .@-_";
  1432.     goodList += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  1433.     goodList += "abcdefghijklmnopqrstuvwxyz";
  1434.     goodList += "0123456789";
  1435.     for (var i = 0; i < aString.length; i++){    
  1436.         var c = aString.charAt(i);
  1437.         var OK = new Boolean(false);
  1438.         for (var j = 0; j < goodList.length; j++){
  1439.             var tChar = goodList.charAt(j);
  1440.             //print(c+" : "+tChar+" : "+OK)
  1441.             if(c == tChar){
  1442.                 OK = true;
  1443.                 break;
  1444.             }//if
  1445.         }//for
  1446.         if(OK == false){aString = aString.replace(c,"_");}
  1447.     }//for
  1448.     return aString;
  1449. }//febeDosHappy
  1450.  
  1451. function febeExtInfo(extGuid){
  1452.  
  1453.   // Get extension info from extensions.rdf
  1454.  
  1455.     var rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  1456.                        .getService(Components.interfaces.nsIRDFService);
  1457.                      
  1458.     var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
  1459.         .getService(Components.interfaces.nsIProperties)
  1460.         .get("ProfD", Components.interfaces.nsIFile);
  1461.     profileDir.append("extensions.rdf");
  1462.     
  1463.     // Fix for international characters
  1464.     var ioServ = Components.classes["@mozilla.org/network/io-service;1"]
  1465.                           .getService(Components.interfaces.nsIIOService);
  1466.     var fph = ioServ.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  1467.     var srcFile = fph.getURLSpecFromFile(profileDir);
  1468.     
  1469.     var ds = rdfs.GetDataSourceBlocking(srcFile);
  1470.     
  1471.     // Use old method if something comes up undefined
  1472.     var em = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
  1473.     var ext = null;
  1474.     if (em.getItemForID){
  1475.         ext = em.getItemForID(extGuid);
  1476.     }else{
  1477.         ext = em.getItemList(extGuid, null, {})[0];
  1478.     }//if
  1479.     
  1480.     var subject = rdfs.GetResource("urn:mozilla:item:"+extGuid);
  1481.     var prefix = "http://www.mozilla.org/2004/em-rdf#";
  1482.     
  1483.   // Guid
  1484.     this.guid = extGuid;
  1485.     
  1486.   // Name
  1487.     var predicate = rdfs.GetResource(prefix + "name");
  1488.     var name = ds.GetTarget(subject, predicate, true);
  1489.     if(name){
  1490.         this.name = name.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1491.     }else{
  1492.         this.name = ext.name;
  1493.     }//if
  1494.     if(!this.name){this.name="(none)";}
  1495.     
  1496.   // Version
  1497.     var predicate = rdfs.GetResource(prefix + "version");
  1498.     var version = ds.GetTarget(subject, predicate, true);
  1499.     if(version){
  1500.         this.version = version.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1501.     }else{
  1502.         this.version = ext.version;
  1503.     }//if
  1504.     if(!this.version){this.version="(none)";}
  1505.  
  1506.   // Description
  1507.     var predicate = rdfs.GetResource(prefix + "description");
  1508.     var description = ds.GetTarget(subject, predicate, true);
  1509.     if(description){this.description = description.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1510.     if(!this.description){this.description="(none)";}
  1511.  
  1512.   // Home Page URL
  1513.     var predicate = rdfs.GetResource(prefix + "homepageURL");
  1514.     var homepageURL = ds.GetTarget(subject, predicate, true);
  1515.     if(homepageURL){this.homepageURL = homepageURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1516.     if(!this.homepageURL){this.homepageURL="";}
  1517.  
  1518.   // Creator
  1519.     var predicate = rdfs.GetResource(prefix + "creator");
  1520.     var creator = ds.GetTarget(subject, predicate, true);
  1521.     if(creator){this.creator = creator.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1522.     if(!this.creator){this.creator="(none)";}
  1523.  
  1524.   // Disabled?
  1525.     var predicate = rdfs.GetResource(prefix + "userDisabled");
  1526.     var userDisabled = ds.GetTarget(subject, predicate, true);
  1527.     if(userDisabled){
  1528.         this.isDisabled = userDisabled.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1529.     }else{
  1530.         this.isDisabled = false;
  1531.     }//if
  1532.  
  1533.   // iconURL
  1534.     var predicate = rdfs.GetResource(prefix + "iconURL");
  1535.     var iconURL = ds.GetTarget(subject, predicate, true);
  1536.     if(iconURL){
  1537.         this.iconURL = iconURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1538.     }else{
  1539.         this.iconURL = ext.iconURL;
  1540.     }//if
  1541.     if(!this.iconURL){this.iconURL="chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";}
  1542.     
  1543.   // minVersion
  1544.     this.minVersion = ext.minAppVersion;
  1545.     if(!this.minVersion){this.minVersion="(none)";}
  1546.     
  1547.   // maxVersion    
  1548.     this.maxVersion = ext.maxAppVersion;
  1549.     if(!this.maxVersion){this.maxVersion="(none)";}
  1550.     
  1551.   // installLocation
  1552.     var predicate = rdfs.GetResource(prefix + "installLocation");
  1553.     var installLocation = ds.GetTarget(subject, predicate, true);
  1554.     if(installLocation){this.installLocation = installLocation.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1555.     if(!this.installLocation){this.installLocation="(none)";}
  1556.     
  1557.   // parseType
  1558.     var predicate = rdfs.GetResource(prefix + "type");
  1559.     var parseType = ds.GetTarget(subject, predicate, true);
  1560.     if(parseType){
  1561.         this.type = parseType.QueryInterface(Components.interfaces.nsIRDFInt).Value;
  1562.     }else{
  1563.         this.type = ext.type;
  1564.     }//if
  1565.  
  1566.   // internalName
  1567.     var predicate = rdfs.GetResource(prefix + "internalName");
  1568.     var internalName = ds.GetTarget(subject, predicate, true);
  1569.     if(internalName){this.internalName = internalName.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1570.     if(!this.internalName){this.internalName="(none)";}
  1571.     
  1572.   // updateURL
  1573.     var predicate = rdfs.GetResource(prefix + "updateURL");
  1574.     var updateURL = ds.GetTarget(subject, predicate, true);
  1575.     if(updateURL){this.updateURL = updateURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1576.     if(!this.updateURL){this.updateURL="(none)";}
  1577.     
  1578.   // optionsURL
  1579.     var predicate = rdfs.GetResource(prefix + "optionsURL");
  1580.     var optionsURL = ds.GetTarget(subject, predicate, true);
  1581.     if(optionsURL){this.optionsURL = optionsURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1582.     if(!this.optionsURL){this.optionsURL="(none)";}
  1583.     
  1584.   // aboutURL
  1585.     var predicate = rdfs.GetResource(prefix + "aboutURL");
  1586.     var aboutURL = ds.GetTarget(subject, predicate, true);
  1587.     if(aboutURL){this.aboutURL = aboutURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1588.     if(!this.aboutURL){this.aboutURL="(none)";}
  1589.     
  1590.   // availableUpdateURL
  1591.     var predicate = rdfs.GetResource(prefix + "availableUpdateURL");
  1592.     var availableUpdateURL = ds.GetTarget(subject, predicate, true);
  1593.     if(availableUpdateURL){this.availableUpdateURL = availableUpdateURL.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1594.     if(!this.availableUpdateURL){this.availableUpdateURL="(none)";}
  1595.     
  1596.   // availableUpdateHash
  1597.     var predicate = rdfs.GetResource(prefix + "availableUpdateHash");
  1598.     var availableUpdateHash = ds.GetTarget(subject, predicate, true);
  1599.     if(availableUpdateHash){this.availableUpdateHash = availableUpdateHash.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1600.     if(!this.availableUpdateHash){this.availableUpdateHash="(none)";}
  1601.     
  1602.   // availableUpdateVersion
  1603.     var predicate = rdfs.GetResource(prefix + "availableUpdateVersion");
  1604.     var availableUpdateVersion = ds.GetTarget(subject, predicate, true);
  1605.     if(availableUpdateVersion){this.availableUpdateVersion = availableUpdateVersion.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;}
  1606.     if(!this.availableUpdateVersion){this.availableUpdateVersion="(none)";}
  1607.     
  1608.   // contributors
  1609.     var predicate = rdfs.GetResource(prefix + "contributor");
  1610.     var targets = ds.GetTargets(subject, predicate, true);
  1611.     var contributors = [];
  1612.     if(targets){
  1613.         while (targets.hasMoreElements()){
  1614.             var contributor = targets.getNext();
  1615.             if (contributor instanceof Components.interfaces.nsIRDFLiteral){
  1616.                 contributors.push(contributor.Value);
  1617.             }//if
  1618.         }//while
  1619.         this.contributors = contributors;
  1620.     }//if
  1621.     return true;
  1622. }//febeExtInfo()
  1623.  
  1624. function febeOpenLink(URL){
  1625.     // Thanks to menet for providing the code to display the results page in an unused tab
  1626.     // if one is availble.
  1627.     if(!URL){return true;}
  1628.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  1629.            .getService(Components.interfaces.nsIWindowMediator);
  1630.     var win = wm.getMostRecentWindow("navigator:browser");
  1631.     var febeGetBrowser = win.getBrowser();
  1632.     var currBlank = (febeGetBrowser &&
  1633.     (febeGetBrowser.mCurrentTab.linkedBrowser &&
  1634.     (febeGetBrowser.mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  1635.     (!febeGetBrowser.mCurrentTab.linkedBrowser &&
  1636.     (febeGetBrowser.mCurrentTab.label == "(Untitled)")));
  1637.     if (currBlank)
  1638.         {
  1639.             var resultsWindow = win.loadURI(URL);
  1640.         } else {
  1641.             var resultsWindow = win.openNewTabWith(URL, this.docURL, null, null);
  1642.     }//if
  1643.     return true;
  1644. }febeOpenLink()
  1645.  
  1646. function febeRestoreProgress(){
  1647.     febeGetPrefs();
  1648.     if(febeDispProgress == true){
  1649.         // Open the progress window
  1650.         febeWin = openDialog("chrome://febe/content/febeRestore.xul", "FEBE", "chrome,dependent,alwaysRaised,centerscreen,dialog='no'");
  1651.         febeWin.focus();
  1652.         // Give the browser a chance to display the progress window before the restore starts
  1653.         febePause(1000);
  1654.     }//if
  1655.     return true;
  1656. }//febeRestoreProgress()
  1657.  
  1658. // ------------------ Backup Functions --------------------
  1659.  
  1660. function febeBackupExtensions(){
  1661.   // Backup extensions and themes
  1662.   
  1663.     var extDir = febeProfDir.clone();
  1664.     extDir.append("extensions");
  1665.     var entries = extDir.directoryEntries;
  1666.  
  1667.     febeExtensionsList = {};
  1668.     febeThemesList = {};
  1669.     febeErrorList = [];
  1670.     febeWarningList = [];
  1671.     febeDisabledCount = 0;
  1672.     febeExtensionsList["**total**"] = 0;      // Associative arrays don't have a 
  1673.     febeThemesList["**total**"] = 0;        // 'length' property ... So keep count
  1674.     
  1675.     if(buExtensions == false && buThemes == false){return true;}
  1676.  
  1677.     while(entries.hasMoreElements()){
  1678.         var entry = entries.getNext();
  1679.         entry.QueryInterface(Components.interfaces.nsIFile);
  1680.         if(!entry.isDirectory()){continue;}    // Don't process junk in the extension directory
  1681.         extGUID = entry.leafName;
  1682.  
  1683.     // Get info for item
  1684.         var thisExt = new febeExtInfo(extGUID);
  1685.         var eType = thisExt.type;                            // 2=Extension, 4=Theme
  1686.         if(eType != 2 && eType != 4){continue;}            // Not an extension or theme ... what is it?
  1687.  
  1688.         if(eType == 2 && buExtensions == false){
  1689.             continue;  // Not backing up extensions at this time
  1690.         }else{
  1691.             exBackedUp = true;
  1692.         }//if
  1693.         if(eType == 4 && buThemes == false){
  1694.             continue;  // Not backing up themes at this time
  1695.         }else{
  1696.             thBackedUp = true;
  1697.         }//if
  1698.  
  1699.         var extIsDisabled = thisExt.isDisabled;
  1700.         if(ignoreDisabled == true){
  1701.             if(extIsDisabled != false){
  1702.                 febeDisabledCount++;
  1703.                 continue;
  1704.             }//if
  1705.         }//if    
  1706.         var extName = thisExt.name;
  1707.         var extVer = febeStripSpaces(thisExt.version);
  1708.         var extIcon = thisExt.iconURL;
  1709.         if(extIsDisabled){extIcon = "chrome://febe/skin/disabled.png";}
  1710.         var extHome = thisExt.homepageURL;
  1711.  
  1712.         var batchFileName = febeStripSpaces(extName)+"{" + extVer + "}";
  1713.         febeExtExt = ".xpi";
  1714.         if(eType == 4){febeExtExt = ".jar"};
  1715.         var extBuName = batchFileName+febeExtExt;
  1716.         var srcName = extDir.clone();
  1717.         srcName.append(extGUID);
  1718.         srcName = srcName.path;
  1719.         febeDestDir = febeTmpDir.clone();
  1720.     
  1721.         var batchlines = [];
  1722.         if(febePlatform == 1){    // Windows
  1723.             febeSubRootDir = extGUID;
  1724.             febeDirCopy(extDir.path);
  1725.             batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  1726.             batchlines.push("SET ZFILE=\"..\\FEBEzip.exe\"");
  1727.             batchlines.push("SET SRCDIR="+"\""+extGUID+"\"");
  1728.             batchlines.push("SET SRCNAME="+"*");
  1729.             batchlines.push("SET DEST=\"..\\"+extBuName+"\"");
  1730.             batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  1731.             batchlines.push("CD %TMPDIR%");
  1732.             batchlines.push("CD %SRCDIR%");
  1733.             batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  1734.         }//if    
  1735.         if(febePlatform == 2){    // *nix
  1736.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1737.             batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1738.             batchlines.push("DEST="+"\""+febeExBuDir+"/"+extBuName+"\"");
  1739.             batchlines.push("export ZFILE");
  1740.             batchlines.push("export DEST");
  1741.             batchlines.push("export SRCDIR");
  1742.             batchlines.push("cd \"$SRCDIR\"");
  1743.             batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  1744.         }//if
  1745.         
  1746.         if(febePlatform == 3){    // Mac
  1747.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1748.             batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1749.             batchlines.push("DEST="+"\""+febeExBuDir+"/"+extBuName+"\"");
  1750.             batchlines.push("export ZFILE");
  1751.             batchlines.push("export DEST");
  1752.             batchlines.push("export SRCDIR");
  1753.             batchlines.push("cd \"$SRCDIR\"");
  1754.             batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  1755.         }//if
  1756.         
  1757.         var item = new febeExtObj;
  1758.         item.Name = batchFileName;
  1759.         item.Path = "";
  1760.         item.Icon = extIcon;
  1761.         item.Home = extHome;
  1762.         item.guid = extGUID;
  1763.         
  1764.         if (febeGoBatch(batchFileName,batchlines)){
  1765.             
  1766.             if(febePlatform == 1){        // Copy the backup to the destination directory
  1767.                 febeCopyFile(febeTmpDir.path+"\\"+extBuName,febeExBuDir,extBuName);
  1768.             }//if
  1769.  
  1770.             item.verified = febeVerify(extBuName);
  1771.         }else{
  1772.             item.verified = false;
  1773.         }//if
  1774.         
  1775.         if(eType == 2){
  1776.                 febeExtensionsList[item.Name] = item;
  1777.                 febeExtensionsList["**total**"]++;    
  1778.             }
  1779.             if(eType == 4){
  1780.                 febeThemesList[item.Name] = item;
  1781.                 febeThemesList["**total**"]++;
  1782.             }
  1783.     }//while
  1784.     return true;
  1785. }//febeBackupExtensions() 
  1786.  
  1787. function febeBackupBookmarks(){
  1788.     bmBackedUp = false;
  1789.     if (!buBookmarks){return true;}
  1790.     var profileDir = febeProfDir.clone();
  1791.     profileDir.append("bookmarks.html");
  1792.     var srcFile = profileDir.path
  1793.     bmBuName ="bookmarks{" + febeProfName  + "}.html";
  1794.     if (febeCopyFile(srcFile,febeExBuDir,bmBuName)){bmBackedUp = febeVerify(bmBuName);}
  1795.     return true;
  1796. }//febeBackupBookmarks()
  1797.  
  1798. function febeBackupPreferences(){
  1799.     prBackedUp = false;
  1800.     if (!buPreferences){return true;}
  1801.     var profileDir = febeProfDir.clone();
  1802.     profileDir.append("prefs.js");
  1803.     var srcFile = profileDir.path
  1804.     prBuName ="prefs{" + febeProfName  + "}.js";
  1805.     if (febeCopyFile(srcFile,febeExBuDir,prBuName)){prBackedUp = febeVerify(prBuName);}
  1806.     return true;
  1807. }//febeBackupPreferences()
  1808.  
  1809. function febeBackupCookies(){
  1810.     ckBackedUp = false;
  1811.     if (!buCookies){return true;}
  1812.     var profileDir = febeProfDir.clone();
  1813.     profileDir.append("cookies.txt");
  1814.     var srcFile = profileDir.path
  1815.     ckBuName ="cookies{" + febeProfName  + "}.txt";
  1816.     if (febeCopyFile(srcFile,febeExBuDir,ckBuName)){ckBackedUp = febeVerify(ckBuName);}
  1817.     return true;
  1818. }//febeBackupCookies()
  1819.  
  1820. function febeBackupUserChrome(){
  1821.     chBackedUp = false;
  1822.     if (!buUserChrome){return true;}
  1823.   // Get pointer to userChrome.css
  1824.     var profileDir = febeProfDir.clone();
  1825.     profileDir.append("chrome");
  1826.     profileDir.append("userChrome.css");
  1827.     if (!profileDir.exists()){return true;}
  1828.     var srcFile = profileDir.path;
  1829.     chBuName ="userChrome{" + febeProfName  + "}.css";
  1830.     if (febeCopyFile(srcFile,febeExBuDir,chBuName)){chBackedUp = febeVerify(chBuName);}
  1831.     return true;
  1832. }//febeBackupUserChrome()
  1833.  
  1834. function febeBackupUserContent(){
  1835.     ucBackedUp = false;
  1836.     if (!buUserContent){return true;}
  1837.   // Get pointer to userChrome.css
  1838.     var profileDir = febeProfDir.clone();
  1839.     profileDir.append("chrome");
  1840.     profileDir.append("userContent.css");
  1841.     if (!profileDir.exists()){return true;}
  1842.     var srcFile = profileDir.path;
  1843.     ucBuName ="userContent{" + febeProfName  + "}.css";
  1844.     if (febeCopyFile(srcFile,febeExBuDir,ucBuName)){ucBackedUp = febeVerify(ucBuName);}
  1845.     return true;
  1846. }//febeBackupUserContent()
  1847.  
  1848. function febeBackupPasswords(){
  1849.     pwBackedUp = false;
  1850.     if (!buUserPwd){return true;}
  1851.     
  1852.     febeExtExt=".fbu"
  1853.     var batchFileName = "usernames-passwords{" + febeDosHappy(febeProfName)  + "}";
  1854.     pwBuName = batchFileName + febeExtExt;
  1855.  
  1856.  
  1857.     var srcName = febeProfDir.clone();
  1858.     srcName = srcName.path;
  1859.     
  1860.     var batchlines = [];
  1861.     if(febePlatform == 1){    // Windows
  1862.       // Copy the files to the tmp directory
  1863.         febeIgnoreError = true;    // Don't worry if signons.txt doesn't exist
  1864.         febeCopyFile(febeProfDir.path+"\\signons.txt",febeTmpDir.path,"signons.txt");
  1865.         febeIgnoreError = true;
  1866.         febeCopyFile(febeProfDir.path+"\\signons2.txt",febeTmpDir.path,"signons2.txt");// Fix for FX 2.0.0.2
  1867.         febeCopyFile(febeProfDir.path+"\\key3.db",febeTmpDir.path,"key3.db");
  1868.         
  1869.         batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  1870.         batchlines.push("SET ZFILE=FEBEzip.exe");
  1871.         batchlines.push("SET SRCNAME=signons*.txt key3.db");
  1872.         batchlines.push("SET DEST="+"\""+pwBuName+"\"");
  1873.         batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  1874.         batchlines.push("CD %TMPDIR%");
  1875.         batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  1876.     }//if
  1877.     
  1878.     if(febePlatform == 2){    // *nix
  1879.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1880.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1881.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+pwBuName+"\"");
  1882.         batchlines.push("SRCNAME=\"signons*.txt key3.db\"");
  1883.         batchlines.push("export ZFILE");
  1884.         batchlines.push("export DEST");
  1885.         batchlines.push("export SRCDIR");
  1886.         batchlines.push("export SRCNAME");
  1887.         batchlines.push("cd \"$SRCDIR\"");
  1888.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" $SRCNAME`");
  1889.     }//if
  1890.     
  1891.     if(febePlatform == 3){    // Mac
  1892.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1893.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1894.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+pwBuName+"\"");
  1895.         batchlines.push("SRCNAME=\"signons*.txt key3.db\"");
  1896.         batchlines.push("export ZFILE");
  1897.         batchlines.push("export DEST");
  1898.         batchlines.push("export SRCDIR");
  1899.         batchlines.push("export SRCNAME");
  1900.         batchlines.push("cd \"$SRCDIR\"");
  1901.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" $SRCNAME`");
  1902.     }//if
  1903.     
  1904.     if (febeGoBatch(batchFileName,batchlines)){
  1905.         if(febePlatform == 1){febeCopyFile(febeTmpDir.path+"\\"+pwBuName,febeExBuDir,pwBuName);}
  1906.         pwBackedUp = febeVerify(pwBuName);
  1907.     }//if
  1908.     return true;
  1909. }//febeBackupPasswords()
  1910.  
  1911. function febeBackupPhishingData(){
  1912.     pdBackedUp = false;
  1913.     if (!buPhishingData){return true;}
  1914.     
  1915.     febeExtExt=".fbu"
  1916.     var batchFileName = "phishing-data{" + febeDosHappy(febeProfName)  + "}";
  1917.     pdBuName = batchFileName + febeExtExt;
  1918.  
  1919.  
  1920.     var srcName = febeProfDir.clone();
  1921.     srcName = srcName.path;
  1922.     
  1923.     var batchlines = [];
  1924.     if(febePlatform == 1){    // Windows
  1925.     // Copy the files to the tmp directory
  1926.         febeCopyFile(febeProfDir.path+"\\kf.txt",febeTmpDir.path,"kf.txt");
  1927.         febeCopyFile(febeProfDir.path+"\\urlclassifier2.sqlite",febeTmpDir.path,"urlclassifier2.sqlite");
  1928.         
  1929.         batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  1930.         batchlines.push("SET ZFILE=FEBEzip.exe");
  1931.         batchlines.push("SET SRCNAME=kf.txt urlclassifier2.sqlite");
  1932.         batchlines.push("SET DEST="+"\""+pdBuName+"\"");
  1933.         batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  1934.         batchlines.push("CD %TMPDIR%");
  1935.         batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  1936.     }//if
  1937.     
  1938.     if(febePlatform == 2){    // *nix
  1939.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1940.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1941.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+pdBuName+"\"");
  1942.         batchlines.push("SRCNAME=\"kf.txt urlclassifier2.sqlite\"");
  1943.         batchlines.push("export ZFILE");
  1944.         batchlines.push("export DEST");
  1945.         batchlines.push("export SRCDIR");
  1946.         batchlines.push("export SRCNAME");
  1947.         batchlines.push("cd \"$SRCDIR\"");
  1948.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" $SRCNAME`");
  1949.     }//if
  1950.     
  1951.     if(febePlatform == 3){    // Mac
  1952.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  1953.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  1954.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+pdBuName+"\"");
  1955.         batchlines.push("SRCNAME=\"kf.txt urlclassifier2.sqlite\"");
  1956.         batchlines.push("export ZFILE");
  1957.         batchlines.push("export DEST");
  1958.         batchlines.push("export SRCDIR");
  1959.         batchlines.push("export SRCNAME");
  1960.         batchlines.push("cd \"$SRCDIR\"");
  1961.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" $SRCNAME`");
  1962.     }//if
  1963.     
  1964.     if (febeGoBatch(batchFileName,batchlines)){
  1965.         if(febePlatform == 1){febeCopyFile(febeTmpDir.path+"\\"+pdBuName,febeExBuDir,pdBuName);}
  1966.         pdBackedUp = febeVerify(pdBuName);
  1967.     }//if
  1968.     return true;
  1969. }//febeBackupPhishingData()
  1970.  
  1971. function febeBackupSearchPlugins(){
  1972.     spBackedUp = false;
  1973.     if (!buSearchPlugins){return true;}
  1974.     
  1975.   // See if search plugins exist
  1976.     var profileDir = febeProfDir.clone();
  1977.     profileDir.append("searchPlugins");
  1978.     if (!(profileDir.exists() && profileDir.isDirectory())){return true;}
  1979.  
  1980.     febeExtExt=".fbu"
  1981.     var batchFileName = "searchPlugins{" + febeDosHappy(febeProfName)  + "}";
  1982.     spBuName = batchFileName + febeExtExt;
  1983.  
  1984.     var srcName = febeProfDir.clone();
  1985.     srcName.append("searchPlugins");
  1986.     srcName = srcName.path;
  1987.     
  1988.     var batchlines = [];
  1989.     if(febePlatform == 1){    // Windows
  1990.     
  1991.     // Copy the files to the tmp directory
  1992.         batchFileName = "searchPlugins";
  1993.         febeSubRootDir = batchFileName;
  1994.         febeDestDir = febeTmpDir.clone();
  1995.         febeDirCopy(srcName);
  1996.                 
  1997.         batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  1998.         batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  1999.         batchlines.push("SET ZFILE=\"..\\FEBEzip.exe\"");
  2000.         batchlines.push("SET SRCNAME=*");
  2001.         batchlines.push("SET DEST=\"..\\"+batchFileName+".fbu"+"\"");
  2002.         batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2003.         batchlines.push("CD %TMPDIR%");
  2004.         batchlines.push("CD %TMP2DIR%");
  2005.         batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  2006.     }//if
  2007.     if(febePlatform == 2){    // *nix
  2008.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2009.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2010.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+spBuName+"\"");
  2011.         batchlines.push("export ZFILE");
  2012.         batchlines.push("export DEST");
  2013.         batchlines.push("export SRCDIR");
  2014.         batchlines.push("cd \"$SRCDIR\"");
  2015.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2016.     }//if
  2017.     if(febePlatform == 3){    // Mac
  2018.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2019.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2020.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+spBuName+"\"");
  2021.         batchlines.push("export ZFILE");
  2022.         batchlines.push("export DEST");
  2023.         batchlines.push("export SRCDIR");
  2024.         batchlines.push("cd \"$SRCDIR\"");
  2025.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2026.     }//if
  2027.     
  2028.     if (febeGoBatch(batchFileName,batchlines)){
  2029.         if(febePlatform == 1){febeCopyFile(febeTmpDir.path+"\\"+batchFileName+".fbu",febeExBuDir,spBuName);}
  2030.         spBackedUp = febeVerify(spBuName);
  2031.     }//if
  2032.     return true;
  2033. }//febeBackupSearchPlugins()
  2034.  
  2035. function febeBackupBrowserHistory(){
  2036.     hsBackedUp = false;
  2037.     if (!buBrowserHistory){return true;}
  2038.   // Get pointer to history.dat
  2039.     var profileDir = febeProfDir.clone();
  2040.     profileDir.append("history.dat");
  2041.     if (!profileDir.exists()){return true;}
  2042.     var srcFile = profileDir.path;
  2043.     hsBuName ="history{" + febeProfName  + "}.dat";
  2044.     if (febeCopyFile(srcFile,febeExBuDir,hsBuName)){hsBackedUp = febeVerify(hsBuName);}
  2045.     return true;
  2046. }//febeBackupBrowserHistory()
  2047.  
  2048. function febeBackupFormFillHistory(){
  2049.     ffBackedUp = false;
  2050.     if (!buFormFillHistory){return true;}
  2051.   // Get pointer to formhistory.dat
  2052.     var profileDir = febeProfDir.clone();
  2053.     profileDir.append("formhistory.dat");
  2054.     if (!profileDir.exists()){return true;}
  2055.     var srcFile = profileDir.path;
  2056.     ffBuName ="formhistory{" + febeProfName  + "}.dat";
  2057.     if (febeCopyFile(srcFile,febeExBuDir,ffBuName)){ffBackedUp = febeVerify(ffBuName);}
  2058.     return true;
  2059. }//febeBackupFormFillHistory()
  2060.  
  2061. function febeBackupPermissions(){
  2062.     pmBackedUp = false;
  2063.     if (!buPermissions){return true;}
  2064.     var profileDir = febeProfDir.clone();
  2065.     profileDir.append("hostperm.1");
  2066.     var srcFile = profileDir.path
  2067.     pmBuName ="hostperm{" + febeProfName  + "}.1";
  2068.     if (febeCopyFile(srcFile,febeExBuDir,pmBuName)){pmBackedUp = febeVerify(pmBuName);}
  2069.     return true;
  2070. }//febeBackupPermissions()
  2071.  
  2072. function febeBackupUDBu(){
  2073.     if (!buUDBu){return true;}
  2074.     febeUDBuInit();
  2075.     udBackedUp = 0;
  2076.     febeUDBuDone = [];
  2077.     for(var i in febeUDBuList){
  2078.         var Label = new String(febeUDBuList[i].Label);
  2079.         if(Label.length == 0){continue;}    // Datafile is empty?
  2080.         var Type = new Number(febeUDBuList[i].Type);
  2081.         var Description = new String(febeUDBuList[i].Description);
  2082.         var Path = new String(febeUDBuList[i].Path);
  2083.         var Include = new Boolean(false);
  2084.         Include = febeUDBuList[i].Include;
  2085.         var item = new febeUDBuDoneObj;
  2086.         item.Description = Description;
  2087.         item.Type = Type;    // Not really needed ... just for completeness    
  2088.         if(Include == "false"){continue;}
  2089.         if(Type == 1){    // Folder
  2090.             febeExtExt=".fbu"
  2091.             var batchFileName = Label+"{" + febeDosHappy(febeProfName)  + "}";
  2092.             udBuName = batchFileName + febeExtExt;
  2093.             var srcName = Path;
  2094.             var batchlines = [];
  2095.             item.Name = udBuName;
  2096.             if(febePlatform == 1){    // Window
  2097.                 // Copy the files to the tmp directory
  2098.                 var batchFileName = "UDBU"+"{" + febeDosHappy(febeProfName)  + "}";
  2099.                 batchFileName = febeUnique(febeTmpDir,batchFileName);
  2100.                 febeSubRootDir = febeLeafname(srcName);
  2101.                 var destName = batchFileName+".fbu";
  2102.                 febeDestDir = febeTmpDir.clone();
  2103.                 febeDirCopy(febeParent(srcName));
  2104.                 batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2105.                 batchlines.push("SET TMP2DIR="+"\""+febeSubRootDir+"\"");
  2106.                 batchlines.push("SET ZFILE=\"..\\FEBEzip.exe\"");
  2107.                 batchlines.push("SET SRCNAME=*");
  2108.                 batchlines.push("SET DEST=\"..\\"+destName+"\"");
  2109.                 batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2110.                 batchlines.push("CD %TMPDIR%");
  2111.                 batchlines.push("CD %TMP2DIR%");
  2112.                 batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  2113.             }//if
  2114.             if(febePlatform == 2){    // *nix
  2115.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2116.                 batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2117.                 batchlines.push("DEST="+"\""+febeExBuDir+"/"+udBuName+"\"");
  2118.                 batchlines.push("export ZFILE");
  2119.                 batchlines.push("export DEST");
  2120.                 batchlines.push("export SRCDIR");
  2121.                 batchlines.push("cd \"$SRCDIR\"");
  2122.                 batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2123.             }//if
  2124.             if(febePlatform == 3){    // Mac
  2125.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2126.                 batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2127.                 batchlines.push("DEST="+"\""+febeExBuDir+"/"+udBuName+"\"");
  2128.                 batchlines.push("export ZFILE");
  2129.                 batchlines.push("export DEST");
  2130.                 batchlines.push("export SRCDIR");
  2131.                 batchlines.push("cd \"$SRCDIR\"");
  2132.                 batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2133.             }//if
  2134.             if (febeGoBatch(batchFileName,batchlines)){
  2135.                 if(febePlatform == 1){febeCopyFile(febeTmpDir.path+"\\"+destName,febeExBuDir,udBuName);}
  2136.                 if(febeVerify(udBuName)){        
  2137.                     udBackedUp++;
  2138.                 }else{
  2139.                     item.Description = "*** Error backing up "+Description;
  2140.                 }//if
  2141.             }//if    
  2142.  
  2143.             febeUDBuDone[Label] = item;
  2144.             
  2145.         }else{        // File
  2146.             var file = Components.classes["@mozilla.org/file/local;1"]
  2147.                 .createInstance(Components.interfaces.nsILocalFile);
  2148.             file.initWithPath(Path);
  2149.             var UDBuName = Label+"{"+febeProfName+"}-"+file.leafName;
  2150.             item.Name = UDBuName;
  2151.             
  2152.             if(file.exists()){
  2153.                 febeCopyFile(Path,febeExBuDir,UDBuName);    
  2154.             }else{
  2155.                 var style = "<style>color: red;font-size: 12pt;</style>";
  2156.                 var tmp = style+febeMsg[166].replace("%path%",Path)+"\n"
  2157.                 febeAlert(tmp);
  2158.             }//if
  2159.             
  2160.             if(febeVerify(UDBuName)){        
  2161.                 udBackedUp++;
  2162.             }else{
  2163.                 item.Description = febeMsg[167].replace("%description%",Description);
  2164.             }//if
  2165.             febeUDBuDone[Label] = item;
  2166.         }//if
  2167.     }//for    
  2168.     return true;
  2169. }//febeBackupUDbu()
  2170.  
  2171. function febeBackupProfile(){
  2172.     upBackedUp = false;
  2173.     febeExtensionsList = [];
  2174.     febeThemesList = [];
  2175.     febeExtensionsList["**total**"] = 0;      // Associative arrays don't have a 
  2176.     febeThemesList["**total**"] = 0;        // 'length' property ... So keep count
  2177.  
  2178.     if (!buProfile){return true;}
  2179.     
  2180.     febeExtExt=".fbu"
  2181.     var batchFileName = "profile{" + febeProfName  + "}";
  2182.     upBuName = batchFileName + febeExtExt; 
  2183.  
  2184.     var srcName = febeProfDir.clone();
  2185.     srcName = srcName.path;
  2186.     
  2187.     var batchlines = [];
  2188.     if(febePlatform == 1){    // Windows
  2189.         // Copy the files to the tmp directory
  2190.         var profile = febeProfDir.clone();
  2191.         febeSubRootDir = profile.leafName;
  2192.         srcName = profile.parent.path;
  2193.         batchFileName = "profile";
  2194.         
  2195.         febeDestDir = febeTmpDir.clone();
  2196.         febeDirCopy(srcName);    
  2197.         
  2198.         // Rename the profile backup
  2199.         try{
  2200.             // Delete old backup file
  2201.             var oldProfile = Components.classes["@mozilla.org/file/local;1"]
  2202.                      .createInstance(Components.interfaces.nsILocalFile);
  2203.             oldProfile.initWithPath(febeDestDir.path);
  2204.             oldProfile.append(batchFileName);
  2205.             if (oldProfile.exists()){
  2206.                 oldProfile.remove(true);
  2207.             }//if
  2208.             var filespec = Components.classes["@mozilla.org/filespec;1"].createInstance(Components.interfaces.nsIFileSpec);
  2209.             filespec.nativePath = febeDestDir.path+"\\"+febeSubRootDir;
  2210.             filespec.rename(batchFileName);
  2211.         }catch(e){
  2212.             var msg = febeMsg[162]+"\n";
  2213.             msg += febeDestDir.path+'\\'+febeSubRootDir+'" to "'+batchFileName+'"';
  2214.             febeFatal(e,msg);
  2215.             return false;
  2216.         }
  2217.         batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2218.         batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2219.         batchlines.push("SET ZFILE=\"..\\FEBEzip.exe\"");
  2220.         batchlines.push("SET SRCNAME=*");
  2221.         batchlines.push("SET DEST=\"..\\"+batchFileName+".fbu"+"\"");
  2222.         batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2223.         batchlines.push("CD %TMPDIR%");
  2224.         batchlines.push("CD %TMP2DIR%");
  2225.         batchlines.push("%ZFILE% -rv %DEST% %SRCNAME%");
  2226.     }//if
  2227.     if(febePlatform == 2){    // *nix
  2228.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2229.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2230.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+upBuName+"\"");
  2231.         batchlines.push("export ZFILE");
  2232.         batchlines.push("export DEST");
  2233.         batchlines.push("export SRCDIR");
  2234.         batchlines.push("cd \"$SRCDIR\"");
  2235.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2236.     }//if
  2237.     if(febePlatform == 3){    // Mac
  2238.         batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2239.         batchlines.push("SRCDIR="+"\""+srcName+"\"");
  2240.         batchlines.push("DEST="+"\""+febeExBuDir+"/"+upBuName+"\"");
  2241.         batchlines.push("export ZFILE");
  2242.         batchlines.push("export DEST");
  2243.         batchlines.push("export SRCDIR");
  2244.         batchlines.push("cd \"$SRCDIR\"");
  2245.         batchlines.push("`\"$ZFILE\" -rv \"$DEST\" *`");
  2246.     }//if
  2247.     
  2248.     if (febeGoBatch(batchFileName,batchlines)){
  2249.         if(febePlatform == 1){
  2250.         febeCopyFile(febeTmpDir.path+"\\"+batchFileName+".fbu",febeExBuDir,upBuName);}
  2251.         upBackedUp = febeVerify(upBuName);
  2252.     }//if
  2253.     return true;
  2254. }//febeBackupProfile()
  2255.  
  2256. // ------------------ End of Backup Functions -------------
  2257.  
  2258. // ------------------ Restore Functions -------------------
  2259.  
  2260. function febeRestoreExtensions(){
  2261.     if(!febeInitDir()){return false;}
  2262.     febePickFiles("*.xpi",25);
  2263.     
  2264.     var xpi = new Array();
  2265.     for (var i = 0; i < febeETinstall.length; i++){    
  2266.         var tmp = "file:///" + febeETinstall[i].Path;
  2267.         var name = febeETinstall[i].Name;
  2268.         xpi[name]=tmp;    
  2269.     }//for
  2270.     InstallTrigger.install(xpi);
  2271.     return true;
  2272. }//febeRestoreExtensions()
  2273.  
  2274. function febeRestoreThemes(){
  2275.     if(!febeInitDir()){return false;}
  2276.     febePickFiles("*.jar",24);
  2277.     
  2278.     var jar = new Array();
  2279.     for (var i = 0; i < febeETinstall.length; i++){    
  2280.         var tmp = "file:///" + febeETinstall[i].Path;
  2281.         var name = febeETinstall[i].Name;
  2282.         jar[name]=tmp;    
  2283.     }//for
  2284.     InstallTrigger.install(jar);
  2285.     return true;
  2286. }//febeRestoreThemes()
  2287.  
  2288. function febeRestoreBookmarks(){
  2289.     if(!febeInitDir()){return false;}
  2290.     febePathName = ""
  2291.     if(!febePickFile("bookmarks*.html",33)){return true};
  2292.     
  2293.     febeGetBuDate(febePathName);
  2294.     if(febeConfirmRestore(37,febeBUdate)){
  2295.         febePrefs.setBoolPref("extensions.febe.restoreBookmarks",true);
  2296.         febePrefs.setCharPref("extensions.febe.restBkmrks.srcName",febePathName);
  2297.         febeAlert(febeMsg[50]);
  2298.         febeRestartFx();
  2299.     }else{
  2300.         febeAlert(febeMsg[46]);
  2301.     }
  2302.     return true;
  2303. }//febeRestoreBookmarks()
  2304.  
  2305. function febeRestoreBookmarksFinish(){
  2306.     febeSetMsgs();
  2307.     if(!febeInitDir()){return false;}
  2308.     var OK = new Boolean(true);
  2309.     try{
  2310.         var febePathName = febePrefs.getCharPref("extensions.febe.restBkmrks.srcName");
  2311.         febeCopyFile(febePathName,febeProfDir.path,"bookmarks.html");
  2312.     }catch(e){
  2313.         var msg = febeMsg[169];
  2314.         OK = false;
  2315.         febeFatal(e,msg);}
  2316.     if(OK){febeAlert(febeMsg[42])};
  2317.     febePrefs.setBoolPref("extensions.febe.restoreBookmarks",false);
  2318.     return true;
  2319. }//febeRestoreBookmarksFinish
  2320.  
  2321. function febeRestorePreferences(){
  2322.     if(!febeInitDir()){return false;}
  2323.     febePathName = ""
  2324.     if(!febePickFile("prefs*.js",34)){return true};
  2325.     febeGetBuDate(febePathName);
  2326.     if(febeConfirmRestore(38,febeBUdate)){
  2327.         
  2328.         // Pointer to preferences
  2329.         var oldPrefs = Components.classes["@mozilla.org/preferences-service;1"]
  2330.                     .getService(Components.interfaces.nsIPrefBranch);
  2331.         
  2332.         // Pointer to new (restored) preferences
  2333.         var newPrefs = Components.classes["@mozilla.org/preferences-service;1"]
  2334.                     .getService(Components.interfaces.nsIPrefService);
  2335.                     
  2336.         // Pointer to backed up preferences file
  2337.         var newPrefFile = Components.classes["@mozilla.org/file/local;1"]
  2338.                     .createInstance(Components.interfaces.nsILocalFile);
  2339.         
  2340.         // Get pointer to "Prefs.js"
  2341.         var PrefsFile = febeProfDir.clone();
  2342.                    
  2343.         PrefsFile.append("prefs.js")
  2344.         newPrefFile.initWithPath(febePathName);             // Initialize backed up prefs file
  2345.         oldPrefs.deleteBranch("");                    // Delete old preferences
  2346.         newPrefs.readUserPrefs(newPrefFile);        // Read in backed up preferences
  2347.         newPrefs.savePrefFile(PrefsFile);            // Save the restored preferences file
  2348.         febeAlert(febeMsg[43]);
  2349.         febeRestartFx();                            // Restart Firefox
  2350.     }else{
  2351.         febeAlert(febeMsg[46]);
  2352.     }
  2353.     return true;
  2354. }//febeRestorePreferences()
  2355.  
  2356. function febeRestoreCookies(){
  2357.     if(!febeInitDir()){return false;}
  2358.     febePathName = ""
  2359.     if(!febePickFile("cookies*.txt",35)){return true};
  2360.     febeGetBuDate(febePathName);
  2361.     if(febeConfirmRestore(39,febeBUdate)){
  2362.         febeCopyFile(febePathName,febeProfDir.path,"cookies.txt");
  2363.         febeAlert(febeMsg[44]);
  2364.     }else{
  2365.         febeAlert(febeMsg[46]);
  2366.     }
  2367.     return true;
  2368. }//febeRestoreCookies()
  2369.  
  2370. function febeRestoreUserChrome(){
  2371.     if(!febeInitDir()){return false;}
  2372.     febePathName = ""
  2373.     var chromeDir = febeProfDir.clone();
  2374.     chromeDir.append("chrome");
  2375.     if(!febePickFile("userChrome*.css",78)){return true};
  2376.     febeGetBuDate(febePathName);
  2377.     if(febeConfirmRestore(68,febeBUdate)){
  2378.         febeCopyFile(febePathName,chromeDir.path,"userChrome.css");
  2379.         febeAlert(febeMsg[79]);
  2380.     }else{
  2381.         febeAlert(febeMsg[46]);
  2382.     }
  2383.     return true;
  2384. }//febeRestoreUserChrome()
  2385.  
  2386. function febeRestoreUserContent(){
  2387.     if(!febeInitDir()){return false;}
  2388.     febePathName = ""
  2389.     var contentDir = febeProfDir.clone();
  2390.     contentDir.append("chrome");
  2391.     if(!febePickFile("userContent*.css",92)){return true};
  2392.     febeGetBuDate(febePathName);
  2393.     if(febeConfirmRestore(69,febeBUdate)){
  2394.         febeCopyFile(febePathName,contentDir.path,"userContent.css");
  2395.         febeAlert(febeMsg[93]);
  2396.     }else{
  2397.         febeAlert(febeMsg[46]);
  2398.     }
  2399.     return true;
  2400. }//febeRestoreUserContent()
  2401.  
  2402. function febeRestorePasswords(){
  2403.     if(!febeInitDir()){return false;}
  2404.     febePathName = ""
  2405.     if(!febePickFile("usernames-passwords*.fbu",80)){return true};    
  2406.     febeGetBuDate(febePathName);
  2407.     if(febeConfirmRestore(70,febeBUdate)){
  2408.         febePrefs.setBoolPref("extensions.febe.restorePasswords",true);
  2409.         febePrefs.setCharPref("extensions.febe.restPwd.srcName",febePathName);
  2410.         febeAlert(febeMsg[94]);
  2411.         febeRestartFx();
  2412.     }else{
  2413.         febeAlert(febeMsg[46]);
  2414.     }
  2415.     return true;
  2416. }//febeRestorePasswords()
  2417.  
  2418. function febeRestorePasswordsFinish(){
  2419.     febeSetMsgs();
  2420.     if(!febeInitDir()){return false;}
  2421.     var OK = new Boolean(true);
  2422.     try{
  2423.         var srcName = febePrefs.getCharPref("extensions.febe.restPwd.srcName");
  2424.         var tmpRestName = "usernames-passwords.fbu";
  2425.         var batchFileName = "restorePasswords";
  2426.     
  2427.         var batchlines = [];
  2428.         if(febePlatform == 1){    // Windows
  2429.         
  2430.         // Copy the archive to the tmp directory
  2431.             febeCopyFile(srcName,febeTmpDir.path,tmpRestName);
  2432.         
  2433.             batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2434.             batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2435.             batchlines.push("SET ZFILE=\"..\\FEBEunzip.exe\"");
  2436.             batchlines.push("SET SRCNAME=\"..\\"+tmpRestName+"\"");
  2437.             batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2438.             batchlines.push("CD %TMPDIR%");
  2439.             batchlines.push("RD /S /Q %TMP2DIR%");
  2440.             batchlines.push("MD %TMP2DIR%");
  2441.             batchlines.push("CD %TMP2DIR%");
  2442.             batchlines.push("%ZFILE% -o %SRCNAME%");
  2443.         }//if
  2444.         if(febePlatform == 2){    // *nix
  2445.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2446.             batchlines.push("SRCNAME=\""+srcName+"\"");
  2447.             batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2448.             batchlines.push("export ZFILE");
  2449.             batchlines.push("export SRCNAME");
  2450.             batchlines.push("export DESTDIR");
  2451.             batchlines.push("cd \"$DESTDIR\"");
  2452.             batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2453.         }//if
  2454.         if(febePlatform == 3){    // Mac
  2455.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2456.             batchlines.push("SRCNAME=\""+srcName+"\"");
  2457.             batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2458.             batchlines.push("export ZFILE");
  2459.             batchlines.push("export SRCNAME");
  2460.             batchlines.push("export DESTDIR");
  2461.             batchlines.push("cd \"$DESTDIR\"");
  2462.             batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2463.         }//if
  2464.         
  2465.         if(febeGoBatch(batchFileName,batchlines)){
  2466.             if(febePlatform == 1){
  2467.                 srcName=febeTmpDir.path+"\\"+batchFileName+"\\signons.txt";
  2468.                 febeIgnoreError = true;    // Don't worry if signons.txt doesn't exist
  2469.                 febeCopyFile(srcName,febeProfDir.path,"signons.txt");
  2470.                 srcName=febeTmpDir.path+"\\"+batchFileName+"\\signons2.txt";
  2471.                 febeIgnoreError = true;
  2472.                 febeCopyFile(srcName,febeProfDir.path,"signons2.txt");
  2473.                 srcName=febeTmpDir.path+"\\"+batchFileName+"\\key3.db";
  2474.                 febeCopyFile(srcName,febeProfDir.path,"key3.db");            
  2475.             }//if
  2476.         }else{
  2477.             throw febeMsg[95];
  2478.         }//if
  2479.         
  2480.     }catch(e){
  2481.         var msg = febeMsg[169];
  2482.         OK = false;
  2483.         febeFatal(e,msg);}
  2484.     if(OK){febeAlert(febeMsg[81])};
  2485.     febePrefs.setBoolPref("extensions.febe.restorePasswords",false);
  2486.     return true;
  2487. }//febeRestorePasswordsFinish
  2488.  
  2489. function febeRestorePhishingData(){
  2490.     if(!febeInitDir()){return false;}
  2491.     febePathName = ""
  2492.     if(!febePickFile("phishing-data*.fbu",82)){return true};    
  2493.     febeGetBuDate(febePathName);
  2494.     if(febeConfirmRestore(71,febeBUdate)){
  2495.         febePrefs.setBoolPref("extensions.febe.restorePhishingData",true);
  2496.         febePrefs.setCharPref("extensions.febe.restPhishingData.srcName",febePathName);
  2497.         febeAlert(febeMsg[96]);
  2498.         febeRestartFx();
  2499.     }else{
  2500.         febeAlert(febeMsg[46]);
  2501.     }
  2502.     return true;
  2503. }//febeRestoreCertificates()
  2504.  
  2505. function febeRestorePhishingDataFinish(){
  2506.     febeSetMsgs();
  2507.     if(!febeInitDir()){return false;}
  2508.     var OK = new Boolean(true);
  2509.     try{
  2510.         var srcName = febePrefs.getCharPref("extensions.febe.restPhishingData.srcName");
  2511.         var tmpRestName = "phishing-data.fbu";
  2512.         var batchFileName = "restorePhishingData";
  2513.     
  2514.         var batchlines = [];
  2515.         if(febePlatform == 1){    // Windows
  2516.           // Copy the archive to the tmp directory
  2517.             febeCopyFile(srcName,febeTmpDir.path,tmpRestName);
  2518.         
  2519.             batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2520.             batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2521.             batchlines.push("SET ZFILE=\"..\\FEBEunzip.exe\"");
  2522.             batchlines.push("SET SRCNAME=\"..\\"+tmpRestName+"\"");
  2523.             batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2524.             batchlines.push("CD %TMPDIR%");
  2525.             batchlines.push("RD /S /Q %TMP2DIR%");
  2526.             batchlines.push("MD %TMP2DIR%");
  2527.             batchlines.push("CD %TMP2DIR%");
  2528.             batchlines.push("%ZFILE% -o %SRCNAME%");
  2529.         }//if
  2530.         if(febePlatform == 2){    // *nix
  2531.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2532.             batchlines.push("SRCNAME=\""+srcName+"\"");
  2533.             batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2534.             batchlines.push("export ZFILE");
  2535.             batchlines.push("export SRCNAME");
  2536.             batchlines.push("export DESTDIR");
  2537.             batchlines.push("cd \"$DESTDIR\"");
  2538.             batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2539.         }//if
  2540.         if(febePlatform == 3){    // Mac
  2541.             batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2542.             batchlines.push("SRCNAME=\""+srcName+"\"");
  2543.             batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2544.             batchlines.push("export ZFILE");
  2545.             batchlines.push("export SRCNAME");
  2546.             batchlines.push("export DESTDIR");
  2547.             batchlines.push("cd \"$DESTDIR\"");
  2548.             batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2549.         }//if
  2550.         
  2551.         if(febeGoBatch(batchFileName,batchlines)){
  2552.             if(febePlatform == 1){
  2553.                 srcName=febeTmpDir.path+"\\"+batchFileName+"\\kf.txt";
  2554.                 if(!febeCopyFile(srcName,febeProfDir.path,"kf.txt")){throw febeMsg[103];}
  2555.                 srcName=febeTmpDir.path+"\\"+batchFileName+"\\urlclassifier2.sqlite";
  2556.                 if(!febeCopyFile(srcName,febeProfDir.path,"urlclassifier2.sqlite")){throw febeMsg[103];}            
  2557.             }//if
  2558.         }else{
  2559.             throw febeMsg[103];
  2560.         }//if
  2561.         
  2562.     }catch(e){
  2563.         var msg = febeMsg[169];
  2564.         OK = false;
  2565.         febeFatal(e,msg);}
  2566.     if(OK){febeAlert(febeMsg[83])};
  2567.     febePrefs.setBoolPref("extensions.febe.restorePhishingData",false);
  2568.     return true;
  2569. }//febeRestorePhishingDataFinish()
  2570.  
  2571. function febeRestoreSearchPlugins(){
  2572.     if(!febeInitDir()){return false;}
  2573.     febePathName = ""
  2574.     if(!febePickFile("searchPlugins*.fbu",84)){return true};
  2575.     
  2576.     febeGetBuDate(febePathName);
  2577.     if(febeConfirmRestore(72,febeBUdate)){
  2578.         if(!febeInitDir()){return false;}
  2579.         var OK = new Boolean(true);
  2580.         try{
  2581.             var batchFileName = "searchPlugins";
  2582.             var tmpRestName = "search-plugins.fbu";
  2583.     
  2584.             var batchlines = [];
  2585.             if(febePlatform == 1){    // Windows
  2586.             // Copy the archive to the tmp directory
  2587.                 febeCopyFile(febePathName,febeTmpDir.path,tmpRestName);
  2588.                 
  2589.                 batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2590.                 batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2591.                 batchlines.push("SET ZFILE=\"..\\FEBEunzip.exe\"");
  2592.                 batchlines.push("SET SRCNAME=\"..\\"+tmpRestName+"\"");
  2593.                 batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2594.                 batchlines.push("CD %TMPDIR%");
  2595.                 batchlines.push("RD /S /Q %TMP2DIR%");
  2596.                 batchlines.push("MD %TMP2DIR%");
  2597.                 batchlines.push("CD %TMP2DIR%");
  2598.                 batchlines.push("%ZFILE% -o %SRCNAME%");
  2599.             }//if
  2600.             if(febePlatform == 2){    // *nix
  2601.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2602.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2603.                 batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2604.                 batchlines.push("export ZFILE");
  2605.                 batchlines.push("export SRCNAME");
  2606.                 batchlines.push("export DESTDIR");
  2607.                 batchlines.push("cd \"$DESTDIR\"");
  2608.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2609.             }//if
  2610.             if(febePlatform == 3){    // Mac
  2611.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2612.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2613.                 batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2614.                 batchlines.push("export ZFILE");
  2615.                 batchlines.push("export SRCNAME");
  2616.                 batchlines.push("export DESTDIR");
  2617.                 batchlines.push("cd \"$DESTDIR\"");
  2618.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2619.             }//if
  2620.             
  2621.             if(febeGoBatch(batchFileName,batchlines)){
  2622.                 if(febePlatform == 1){
  2623.                     febeSubRootDir = batchFileName;
  2624.                     febeDestDir = febeProfDir.clone();
  2625.                     febeDirCopy(febeTmpDir.path+"\\"+batchFileName);        
  2626.                 }//if
  2627.             }else{
  2628.                 throw febeMsg[97];
  2629.             }//if
  2630.             
  2631.         }catch(e){
  2632.             var msg = febeMsg[169];
  2633.             OK = false;
  2634.             febeFatal(e,msg);}
  2635.         if(OK){
  2636.             febeAlert(febeMsg[85]);
  2637.         }else{
  2638.             febeAlert(febeMsg[46]);
  2639.         }
  2640.     }
  2641.     return true;
  2642. }//febeRestoreSearchPlugins()
  2643.  
  2644. function febeRestoreBrowserHistory(){
  2645.     if(!febeInitDir()){return false;}
  2646.     febePathName = ""
  2647.     if(!febePickFile("history*.dat",86)){return true};
  2648.     febeGetBuDate(febePathName);
  2649.     if(febeConfirmRestore(73,febeBUdate)){
  2650.         febePrefs.setBoolPref("extensions.febe.restoreHistory",true);
  2651.         febePrefs.setCharPref("extensions.febe.restHistory.srcName",febePathName);
  2652.         febeAlert(febeMsg[106]);
  2653.         febeRestartFx();
  2654.     }else{
  2655.         febeAlert(febeMsg[46]);
  2656.     }
  2657.     return true;
  2658. }//febeRestoreBrowserHistory()
  2659.  
  2660. function febeRestoreBrowserHistoryFinish(){
  2661.     febeSetMsgs();
  2662.     if(!febeInitDir()){return false;}
  2663.     var OK = new Boolean(true);
  2664.     try{
  2665.         var febePathName = febePrefs.getCharPref("extensions.febe.restHistory.srcName");
  2666.         febeCopyFile(febePathName,febeProfDir.path,"history.dat");
  2667.     }catch(e){
  2668.         var msg = febeMsg[169];
  2669.         OK = false;
  2670.         febeFatal(e,msg);}
  2671.     if(OK){febeAlert(febeMsg[87])};
  2672.     febePrefs.setBoolPref("extensions.febe.restoreHistory",false);
  2673.     return true;
  2674. }//febeRestoreBookmarksFinish
  2675.  
  2676. function febeRestoreFormFillHistory(){
  2677.     if(!febeInitDir()){return false;}
  2678.     febePathName = ""
  2679.     if(!febePickFile("formhistory*.dat",88)){return true};
  2680.     febeGetBuDate(febePathName);
  2681.     if(febeConfirmRestore(74,febeBUdate)){
  2682.         febeCopyFile(febePathName,febeProfDir.path,"formhistory.dat");
  2683.         febeAlert(febeMsg[89]);
  2684.     }else{
  2685.         febeAlert(febeMsg[46]);
  2686.     }
  2687.     return true;
  2688. }//febeRestoreFormFillHistory()
  2689.  
  2690. function febeRestorePermissions(){
  2691.     if(!febeInitDir()){return false;}
  2692.     febePathName = ""
  2693.     if(!febePickFile("hostperm*.1",117)){return true};
  2694.     febeGetBuDate(febePathName);
  2695.     if(febeConfirmRestore(118,febeBUdate)){
  2696.         febeCopyFile(febePathName,febeProfDir.path,"hostperm.1");
  2697.         febeAlert(febeMsg[119]);
  2698.     }else{
  2699.         febeAlert(febeMsg[46]);
  2700.     }
  2701.     return true;
  2702. }//febeRestorePermissions()
  2703.  
  2704. function febeRestoreUDBu(){
  2705.     
  2706.     return true;
  2707. }//febeRestoreUDBu()
  2708.  
  2709. function febeRestoreProfile(){
  2710.     if(!febeInitDir()){return false;}
  2711.     febePathName = ""
  2712.     if(!febePickFile("profile*.fbu",90)){return true};
  2713.     
  2714.     var prefName = "extensions.febe.selectedRestoreProfile";
  2715.     febePrefs.setCharPref(prefName,febePathName);
  2716.     
  2717.     var prefName = "extensions.febe.selectedRestoreProfileName";
  2718.     febePrefs.setCharPref(prefName,febePrName);
  2719.  
  2720.     // Open restore profile window
  2721.     febeWin = window.openDialog("chrome://febe/content/febeProfile.xul", "FEBE", "chrome,alwaysRaised,centerscreen");    
  2722.     return true;
  2723. }//febeRestoreProfile()
  2724.  
  2725. function febeProfileWindowInit(){
  2726.     if(!febeInitDir()){return false;}
  2727.     febeWin = this.window.document;
  2728.  
  2729.     febeProfList = [];
  2730.     febeGetProfileList(febeProfList);
  2731.     
  2732.     febeWin.getElementById("febeCurrentProfileText").value = febeProfName ;
  2733.     
  2734.     var prefName = "extensions.febe.selectedRestoreProfile";
  2735.     var febePathName = febePrefs.getCharPref(prefName);  // Full path to backed up profile
  2736.     
  2737.     var prefName = "extensions.febe.selectedRestoreProfileName";
  2738.     var febePrName = febePrefs.getCharPref(prefName);
  2739.     febeWin.getElementById("febeSelectedProfileText").value = febePrName;
  2740.  
  2741.     for(var i = 0; i < febeProfList.length; i++){
  2742.         var item = febeWin.getElementById("febeProfileList")
  2743.             .insertItemAt ( i, febeProfList[i].Name , febeProfList[i].Path)
  2744.         if(item.label == febeProfName ){item.disabled = true;}
  2745.     }//for
  2746.  
  2747.     // If there is only one profile, display help message
  2748.     if(febeProfList.length == 1){
  2749.         window.openDialog("chrome://febe/content/febeProfileRestoreMsg.xul", "FEBE Alert", "chrome,modal,dialog=yes,alwaysRaised,centerscreen,resizable");    
  2750.     }//if
  2751.     return true;
  2752. }//febeProfileWindowInit()
  2753.  
  2754. function febeProfileSelected(pIndex){
  2755.     febeWin = this.window.document;
  2756.     if(!febeWin.getElementById("febeProfileList").selectedItem){  // Profile selected?
  2757.         febeAlert(febeMsg[48]);
  2758.         return false;
  2759.     }//if
  2760.     
  2761.     var item = febeWin.getElementById("febeProfileList").selectedItem.label;
  2762.     if(item == febeProfName ){
  2763.         febeAlert(febeMsg[6]);
  2764.         return false;
  2765.     }//if
  2766.     febeWin.getElementById("febeDestinationProfileText").value = item;
  2767.     var pIndex = febeWin.getElementById("febeProfileList").selectedIndex;
  2768.     return true;
  2769. }//febeProfileSelected()
  2770.  
  2771. function febeGetProfileList(febeProfList){
  2772.     // Create pointer to Firefox root directory (where the profile directories reside)
  2773.     var files = Components.classes["@mozilla.org/file/directory_service;1"]
  2774.         .getService(Components.interfaces.nsIProperties)
  2775.         .get("ProfD", Components.interfaces.nsIFile);// Was "DefProfRt"
  2776.     var parentDir = Components.classes["@mozilla.org/file/local;1"]
  2777.                  .createInstance(Components.interfaces.nsILocalFile);
  2778.         parentDir.initWithPath(files.parent.path);
  2779.         
  2780.     var entries = parentDir.directoryEntries;
  2781.     while(entries.hasMoreElements()){
  2782.         var entry = entries.getNext();   
  2783.         entry.QueryInterface(Components.interfaces.nsILocalFile);
  2784.         if(!entry.isDirectory()){continue;}
  2785.         var p = new febeProfileObj;
  2786.         var x = entry.leafName;
  2787.         var P = x.indexOf(".");
  2788.         p.Name = x.substring(P+1);
  2789.         p.Path = entry.path;
  2790.         febeProfList.push(p);
  2791.     }//while
  2792.     return true;
  2793. }//febeGetProfileList()
  2794.  
  2795. function febeStartProfileRestore(){
  2796.     if(!febeInitDir()){return false;}
  2797.     febeWin = this.window.document;
  2798.     if(!febeProfileSelected()){return false};
  2799.     var pIndex = febeWin.getElementById("febeProfileList").selectedIndex;
  2800.     febeWin.getElementById("febeProfileResoreBox").hidden = false;
  2801.     
  2802.     var prefName = "extensions.febe.selectedRestoreProfile";
  2803.     febePathName = febePrefs.getCharPref(prefName);  // Full path to backed up profile
  2804.     febeGetBuDate(febePathName);
  2805.     if(febeConfirmRestore(75,febeBUdate)){
  2806.         if(!febeInitDir()){return false;}
  2807.         
  2808.         // Remove contents of destination profile
  2809.         var destProfile = febeProfList[pIndex].Path;
  2810.         pDestDir = Components.classes["@mozilla.org/file/local;1"]
  2811.                  .createInstance(Components.interfaces.nsILocalFile);
  2812.         pDestDir.initWithPath(destProfile);
  2813.         var entries = pDestDir.directoryEntries;
  2814.         while(entries.hasMoreElements()){
  2815.             var entry = entries.getNext();   
  2816.             entry.QueryInterface(Components.interfaces.nsILocalFile);
  2817.             entry.remove(true);
  2818.         }//while
  2819.         var OK = new Boolean(true);
  2820.         try{
  2821.             var batchFileName = "profileRestore";
  2822.             var tmpRestName = batchFileName+".fbu";
  2823.             var batchlines = [];
  2824.             if(febePlatform == 1){    // Windows
  2825.               // Copy the archive to the temp directory, renaming it
  2826.                 febeCopyFile(febePathName,febeTmpDir.path,tmpRestName)
  2827.                 batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2828.                 batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2829.                 batchlines.push("SET ZFILE=\"..\\FEBEunzip.exe\"");
  2830.                 batchlines.push("SET SRCNAME=\"..\\"+tmpRestName+"\"");
  2831.                 batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2832.                 batchlines.push("CD %TMPDIR%");
  2833.                 batchlines.push("RD /S /Q %TMP2DIR%");
  2834.                 batchlines.push("MD %TMP2DIR%");
  2835.                 batchlines.push("CD %TMP2DIR%");
  2836.                 batchlines.push("%ZFILE% -o %SRCNAME%");
  2837.             }//if
  2838.             if(febePlatform == 2){    // *nix
  2839.                 batchlines.push("ZFILE="+"\""+febeUnZipFile.path+"\"");
  2840.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2841.                 batchlines.push("DESTDIR="+"\""+febeProfList[pIndex].Path+"\"");
  2842.                 batchlines.push("export ZFILE");
  2843.                 batchlines.push("export SRCNAME");
  2844.                 batchlines.push("export DESTDIR");
  2845.                 batchlines.push("cd \"$DESTDIR\"");
  2846.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2847.             }//if
  2848.             if(febePlatform == 3){    // Mac
  2849.                 batchlines.push("ZFILE="+"\""+febeUnZipFile.path+"\"");
  2850.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2851.                 batchlines.push("DESTDIR="+"\""+febeProfList[pIndex].Path+"\"");
  2852.                 batchlines.push("export ZFILE");
  2853.                 batchlines.push("export SRCNAME");
  2854.                 batchlines.push("export DESTDIR");
  2855.                 batchlines.push("cd \"$DESTDIR\"");
  2856.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2857.             }//if
  2858.             
  2859.             if(febeGoBatch(batchFileName,batchlines)){
  2860.                 if(febePlatform == 1){
  2861.                     febeSubRootDir = batchFileName;
  2862.                     febeDestDir = pDestDir.clone();
  2863.                     febeTmpDir.append(batchFileName);
  2864.                     var entries = febeTmpDir.directoryEntries;
  2865.                     while(entries.hasMoreElements()){
  2866.                         var entry = entries.getNext();   
  2867.                         entry.QueryInterface(Components.interfaces.nsILocalFile);
  2868.                         entry.copyTo(pDestDir,null);
  2869.                     }//while    
  2870.                 }//if
  2871.             }else{
  2872.                 throw febeMsg[102];
  2873.             }//if
  2874.         }catch(e){
  2875.             var msg = febeMsg[169];
  2876.             OK = false;
  2877.             febeFatal(e,msg);}
  2878.         if(OK){
  2879.             febeAlert(febeMsg[91]);
  2880.         }else{
  2881.             febeAlert(febeMsg[46]);
  2882.         }//if
  2883.     }//if
  2884.     return true;
  2885. }//febeStartProfileRestore()
  2886.  
  2887. function febeRestoreUDBU(index){
  2888.     var udbuLabel = febeUDBuList[index].Label;
  2889.     var udbuDescription = febeUDBuList[index].Description;
  2890.     var udbuType = parseInt(febeUDBuList[index].Type);
  2891.     var udbuPath = febeUDBuList[index].Path; 
  2892.     febePathName = ""
  2893.     if(!febeInitDir()){return false;}
  2894.     var fMask = udbuLabel.replace(/ /g,"?")+"*";
  2895.     if(udbuType == 1){fMask = udbuLabel.replace(/ /g,"?")+"*.fbu";}
  2896.     if(!febePickFile(fMask,161)){return false;};
  2897.     febeGetBuDate(febePathName);
  2898.     febeSetMsgs();
  2899.     febeMsg[163] = febeMsg[163].replace(/%fname%/,udbuDescription);
  2900.     febeMsg[164] = febeMsg[164].replace(/%fname%/,udbuDescription);
  2901.     if(udbuType == 0){
  2902.       // File restore is a straight copy
  2903.         if(febeConfirmRestore(163,febeBUdate)){
  2904.             febeCopyFile(febePathName,febeParent(udbuPath),febeLeafname(udbuPath));
  2905.             febeAlert(febeMsg[164]);
  2906.         }else{
  2907.             febeAlert(febeMsg[46]);
  2908.         }//if
  2909.     }else{
  2910.       // Restore backed up folder
  2911.         var batchFileName = "UDBU";
  2912.         var tmpRestName = "UDBUrestore.fbu";
  2913.         var batchlines = [];
  2914.         if(febeConfirmRestore(163,febeBUdate)){
  2915.             febeRestoreProgress();
  2916.             if(febePlatform == 1){    // Windows
  2917.               // Copy the archive to the tmp directory
  2918.                 febeCopyFile(febePathName,febeTmpDir.path,tmpRestName);
  2919.                     
  2920.                 batchlines.push("SET TMPDIR="+"\""+febeTmpDir.path+"\"");
  2921.                 batchlines.push("SET TMP2DIR="+"\""+batchFileName+"\"");
  2922.                 batchlines.push("SET ZFILE=\"..\\FEBEunzip.exe\"");
  2923.                 batchlines.push("SET SRCNAME=\"..\\"+tmpRestName+"\"");
  2924.                 batchlines.push(febeTmpDir.path.slice(0,2));  // Set dirve letter (i.e., "C:")
  2925.                 batchlines.push("CD %TMPDIR%");
  2926.                 batchlines.push("RD /S /Q %TMP2DIR%");
  2927.                 batchlines.push("MD %TMP2DIR%");
  2928.                 batchlines.push("CD %TMP2DIR%");
  2929.                 batchlines.push("%ZFILE% -o %SRCNAME%");
  2930.             }//if
  2931.             if(febePlatform == 2){    // *nix
  2932.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2933.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2934.                 batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2935.                 batchlines.push("export ZFILE");
  2936.                 batchlines.push("export SRCNAME");
  2937.                 batchlines.push("export DESTDIR");
  2938.                 batchlines.push("cd \"$DESTDIR\"");
  2939.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2940.             }//if
  2941.             if(febePlatform == 3){    // Mac
  2942.                 batchlines.push("ZFILE="+"\""+febeZipFile.path+"\"");
  2943.                 batchlines.push("SRCNAME=\""+febePathName+"\"");
  2944.                 batchlines.push("DESTDIR="+"\""+febeProfDir.path+"\"");
  2945.                 batchlines.push("export ZFILE");
  2946.                 batchlines.push("export SRCNAME");
  2947.                 batchlines.push("export DESTDIR");
  2948.                 batchlines.push("cd \"$DESTDIR\"");
  2949.                 batchlines.push("`\"$ZFILE\" -o \"$SRCNAME\"`");
  2950.             }//if
  2951.                 
  2952.             if(febeGoBatch(batchFileName,batchlines)){
  2953.                 if(febePlatform == 1){
  2954.                     // Create pointer to destination file
  2955.                     febeDestDir = Components.classes["@mozilla.org/file/local;1"]
  2956.                                 .createInstance(Components.interfaces.nsILocalFile);
  2957.                     febeDestDir.initWithPath(udbuPath);
  2958.                     febeSubRootDir = batchFileName;
  2959.                     febeDirCopy2(febeTmpDir.path+"\\"+batchFileName,batchFileName);    
  2960.                 }//if
  2961.             }else{
  2962.                 throw febeMsg[97];
  2963.             }//if
  2964.             febeAlert(febeMsg[164]);
  2965.         }else{
  2966.             febeAlert(febeMsg[46]);
  2967.         }//if
  2968.     }//if
  2969.     return true;
  2970. }//febeRestoreUSBU()
  2971.  
  2972. function febeDirCopy2(sourceDir,batchFileName){
  2973. // Recursively copy individual files and sub-directories to a destination directory
  2974. // Very tricky code ... could be written better.  So little time, so much to do
  2975.     var tmp = "sourceDir: "+sourceDir;
  2976.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  2977.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  2978.  
  2979.     var aFile = Components.classes["@mozilla.org/file/local;1"]
  2980.         .createInstance(Components.interfaces.nsILocalFile);
  2981.     if (!aFile) return false;
  2982.  
  2983.     aFile.initWithPath(sourceDir);
  2984.     var entries = aFile.directoryEntries;
  2985.     
  2986.     while(entries.hasMoreElements()){
  2987.         var entry = entries.getNext();
  2988.         entry.QueryInterface(Components.interfaces.nsIFile);
  2989.         var src = entry.path;
  2990.         var p = src.indexOf(febeSubRootDir)
  2991.         if(p == -1){continue;}
  2992.         if(entry.isDirectory()){
  2993.             febeDirCopy2(src,batchFileName);
  2994.         }else{
  2995.             var parentPath = entry.parent.path;
  2996.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  2997.             var re = "\\"+batchFileName+"";
  2998.             ;
  2999.             var file = entry.leafName;
  3000.             febeCopyFile(src,dest.replace(re,"\\"),file);
  3001.         }//if
  3002.     }//while
  3003.     return true;
  3004. }//febeDirCopy2()
  3005.  
  3006. // ------------------ End of Restore Functions ------------
  3007.  
  3008. //alert("febe.js loaded");